formbro-mcp-server 1.0.0
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/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +15 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +299 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/common.d.ts +77 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +42 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/services/api-client.d.ts +38 -0
- package/dist/services/api-client.d.ts.map +1 -0
- package/dist/services/api-client.js +125 -0
- package/dist/services/api-client.js.map +1 -0
- package/dist/tools/applicants.d.ts +6 -0
- package/dist/tools/applicants.d.ts.map +1 -0
- package/dist/tools/applicants.js +261 -0
- package/dist/tools/applicants.js.map +1 -0
- package/dist/tools/applications.d.ts +6 -0
- package/dist/tools/applications.d.ts.map +1 -0
- package/dist/tools/applications.js +225 -0
- package/dist/tools/applications.js.map +1 -0
- package/dist/tools/employers.d.ts +6 -0
- package/dist/tools/employers.d.ts.map +1 -0
- package/dist/tools/employers.js +243 -0
- package/dist/tools/employers.js.map +1 -0
- package/dist/tools/find.d.ts +6 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +122 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/types.d.ts +86 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE3E,oBAAoB;AACpB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;SACd,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,SAAS,CAAC;SACd,OAAO,CAAC,aAAa,CAAC;SACtB,QAAQ,CAAC,0DAA0D,CAAC;IACvE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;SACf,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,0CAA0C,CAAC;CACxD,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,yBAAyB;AACzB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,eAAe,EAAE,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC;SAC1C,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;SAChC,QAAQ,CAAC,6EAA6E,CAAC;CAC3F,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,wCAAwC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE9E,sBAAsB;AACtB,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;SACX,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,0CAA0C,CAAC;CACxD,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAEvE,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;SACf,QAAQ,EAAE;SACV,QAAQ,CAAC,6DAA6D,CAAC;CAC3E,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,0BAA0B;AAC1B,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AxiosInstance } from "axios";
|
|
2
|
+
/**
|
|
3
|
+
* Initialize the default API client (for STDIO mode)
|
|
4
|
+
*/
|
|
5
|
+
export declare function initializeApiClient(baseUrl: string, token: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Set base URL for HTTP mode (without token)
|
|
8
|
+
*/
|
|
9
|
+
export declare function setBaseUrl(baseUrl: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Create an API client for a specific request with its own token
|
|
12
|
+
*/
|
|
13
|
+
export declare function createApiClientWithToken(token: string): AxiosInstance;
|
|
14
|
+
/**
|
|
15
|
+
* Run a function with a specific API client in context
|
|
16
|
+
*/
|
|
17
|
+
export declare function runWithApiClient<T>(apiClient: AxiosInstance, fn: () => T): T;
|
|
18
|
+
/**
|
|
19
|
+
* Get the API client for current request context
|
|
20
|
+
*/
|
|
21
|
+
export declare function getApiClient(): AxiosInstance;
|
|
22
|
+
/**
|
|
23
|
+
* Make an API request to FormBro backend
|
|
24
|
+
*/
|
|
25
|
+
export declare function makeApiRequest<T>(endpoint: string, method?: "GET" | "POST" | "PUT" | "PATCH" | "DELETE", data?: unknown, params?: Record<string, unknown>): Promise<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Handle API errors and return user-friendly messages
|
|
28
|
+
*/
|
|
29
|
+
export declare function handleApiError(error: unknown): string;
|
|
30
|
+
/**
|
|
31
|
+
* Check if the API client is properly configured
|
|
32
|
+
*/
|
|
33
|
+
export declare function isApiClientConfigured(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get the base URL
|
|
36
|
+
*/
|
|
37
|
+
export declare function getBaseUrl(): string | null;
|
|
38
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"AAEA,OAAc,EAAE,aAAa,EAAc,MAAM,OAAO,CAAC;AAUzD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAWxE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAarE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,aAAa,CAW5C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAgB,EAC3D,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC,CASZ;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA6BrD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAE1C"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// FormBro API Client with Token Authentication
|
|
2
|
+
import axios, { AxiosError } from "axios";
|
|
3
|
+
import { API_TIMEOUT } from "../constants.js";
|
|
4
|
+
let defaultApiClient = null;
|
|
5
|
+
let defaultBaseUrl = null;
|
|
6
|
+
// AsyncLocalStorage for per-request API client
|
|
7
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
8
|
+
const requestContext = new AsyncLocalStorage();
|
|
9
|
+
/**
|
|
10
|
+
* Initialize the default API client (for STDIO mode)
|
|
11
|
+
*/
|
|
12
|
+
export function initializeApiClient(baseUrl, token) {
|
|
13
|
+
defaultBaseUrl = baseUrl.replace(/\/$/, "");
|
|
14
|
+
defaultApiClient = axios.create({
|
|
15
|
+
baseURL: defaultBaseUrl,
|
|
16
|
+
timeout: API_TIMEOUT,
|
|
17
|
+
headers: {
|
|
18
|
+
"Content-Type": "application/json",
|
|
19
|
+
"Accept": "application/json",
|
|
20
|
+
"Authorization": `Bearer ${token}`
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set base URL for HTTP mode (without token)
|
|
26
|
+
*/
|
|
27
|
+
export function setBaseUrl(baseUrl) {
|
|
28
|
+
defaultBaseUrl = baseUrl.replace(/\/$/, "");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create an API client for a specific request with its own token
|
|
32
|
+
*/
|
|
33
|
+
export function createApiClientWithToken(token) {
|
|
34
|
+
if (!defaultBaseUrl) {
|
|
35
|
+
throw new Error("API base URL not configured. Set FORMBRO_API_URL environment variable.");
|
|
36
|
+
}
|
|
37
|
+
return axios.create({
|
|
38
|
+
baseURL: defaultBaseUrl,
|
|
39
|
+
timeout: API_TIMEOUT,
|
|
40
|
+
headers: {
|
|
41
|
+
"Content-Type": "application/json",
|
|
42
|
+
"Accept": "application/json",
|
|
43
|
+
"Authorization": `Bearer ${token}`
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Run a function with a specific API client in context
|
|
49
|
+
*/
|
|
50
|
+
export function runWithApiClient(apiClient, fn) {
|
|
51
|
+
return requestContext.run({ apiClient }, fn);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the API client for current request context
|
|
55
|
+
*/
|
|
56
|
+
export function getApiClient() {
|
|
57
|
+
const store = requestContext.getStore();
|
|
58
|
+
if (store?.apiClient) {
|
|
59
|
+
return store.apiClient;
|
|
60
|
+
}
|
|
61
|
+
if (!defaultApiClient) {
|
|
62
|
+
throw new Error("API client not initialized. For HTTP mode, include Authorization header. For STDIO mode, set FORMBRO_API_TOKEN.");
|
|
63
|
+
}
|
|
64
|
+
return defaultApiClient;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Make an API request to FormBro backend
|
|
68
|
+
*/
|
|
69
|
+
export async function makeApiRequest(endpoint, method = "GET", data, params) {
|
|
70
|
+
const client = getApiClient();
|
|
71
|
+
const response = await client.request({
|
|
72
|
+
method,
|
|
73
|
+
url: endpoint,
|
|
74
|
+
data,
|
|
75
|
+
params
|
|
76
|
+
});
|
|
77
|
+
return response.data;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Handle API errors and return user-friendly messages
|
|
81
|
+
*/
|
|
82
|
+
export function handleApiError(error) {
|
|
83
|
+
if (error instanceof AxiosError) {
|
|
84
|
+
if (error.response) {
|
|
85
|
+
const status = error.response.status;
|
|
86
|
+
const detail = error.response.data?.detail || error.response.data?.message;
|
|
87
|
+
switch (status) {
|
|
88
|
+
case 401:
|
|
89
|
+
return "Error: Authentication failed. Please check your FORMBRO_API_TOKEN is valid.";
|
|
90
|
+
case 403:
|
|
91
|
+
return "Error: Permission denied. You don't have access to this resource.";
|
|
92
|
+
case 404:
|
|
93
|
+
return `Error: Resource not found. ${detail || "Please check the ID is correct."}`;
|
|
94
|
+
case 422:
|
|
95
|
+
return `Error: Invalid request. ${detail || "Please check your parameters."}`;
|
|
96
|
+
case 429:
|
|
97
|
+
return "Error: Rate limit exceeded. Please wait before making more requests.";
|
|
98
|
+
case 500:
|
|
99
|
+
return "Error: FormBro server error. Please try again later.";
|
|
100
|
+
default:
|
|
101
|
+
return `Error: API request failed with status ${status}. ${detail || ""}`;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else if (error.code === "ECONNABORTED") {
|
|
105
|
+
return "Error: Request timed out. Please try again.";
|
|
106
|
+
}
|
|
107
|
+
else if (error.code === "ECONNREFUSED") {
|
|
108
|
+
return "Error: Could not connect to FormBro server. Please check FORMBRO_API_URL.";
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return `Error: Unexpected error occurred: ${error instanceof Error ? error.message : String(error)}`;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check if the API client is properly configured
|
|
115
|
+
*/
|
|
116
|
+
export function isApiClientConfigured() {
|
|
117
|
+
return defaultApiClient !== null || defaultBaseUrl !== null;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get the base URL
|
|
121
|
+
*/
|
|
122
|
+
export function getBaseUrl() {
|
|
123
|
+
return defaultBaseUrl;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAE/C,OAAO,KAAK,EAAE,EAAiB,UAAU,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,IAAI,gBAAgB,GAAyB,IAAI,CAAC;AAClD,IAAI,cAAc,GAAkB,IAAI,CAAC;AAEzC,+CAA+C;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,MAAM,cAAc,GAAG,IAAI,iBAAiB,EAAgC,CAAC;AAE7E;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,KAAa;IAChE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;QAC9B,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,kBAAkB;YAC5B,eAAe,EAAE,UAAU,KAAK,EAAE;SACnC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,kBAAkB;YAC5B,eAAe,EAAE,UAAU,KAAK,EAAE;SACnC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAI,SAAwB,EAAE,EAAW;IACvE,OAAO,cAAc,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IACxC,IAAI,KAAK,EAAE,SAAS,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;IACJ,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,SAAsD,KAAK,EAC3D,IAAc,EACd,MAAgC;IAEhC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAI;QACvC,MAAM;QACN,GAAG,EAAE,QAAQ;QACb,IAAI;QACJ,MAAM;KACP,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;YAE3E,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,GAAG;oBACN,OAAO,6EAA6E,CAAC;gBACvF,KAAK,GAAG;oBACN,OAAO,mEAAmE,CAAC;gBAC7E,KAAK,GAAG;oBACN,OAAO,8BAA8B,MAAM,IAAI,iCAAiC,EAAE,CAAC;gBACrF,KAAK,GAAG;oBACN,OAAO,2BAA2B,MAAM,IAAI,+BAA+B,EAAE,CAAC;gBAChF,KAAK,GAAG;oBACN,OAAO,sEAAsE,CAAC;gBAChF,KAAK,GAAG;oBACN,OAAO,sDAAsD,CAAC;gBAChE;oBACE,OAAO,yCAAyC,MAAM,KAAK,MAAM,IAAI,EAAE,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACzC,OAAO,6CAA6C,CAAC;QACvD,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACzC,OAAO,2EAA2E,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACvG,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,gBAAgB,KAAK,IAAI,IAAI,cAAc,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicants.d.ts","sourceRoot":"","sources":["../../src/tools/applicants.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8FpE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqM9D"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
// Applicant Tools for FormBro MCP Server
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { makeApiRequest, handleApiError } from "../services/api-client.js";
|
|
4
|
+
import { ListWithSearchSchema, IdWithFormatSchema } from "../schemas/common.js";
|
|
5
|
+
import { ResponseFormat, CHARACTER_LIMIT } from "../constants.js";
|
|
6
|
+
// Extended schema for listing applicants
|
|
7
|
+
const ListApplicantsSchema = ListWithSearchSchema.extend({
|
|
8
|
+
program: z.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("Filter by program type (e.g., 'tr', 'pr', 'lmia')")
|
|
11
|
+
}).strict();
|
|
12
|
+
/**
|
|
13
|
+
* Format applicant list item as Markdown (flattened structure from list endpoint)
|
|
14
|
+
*/
|
|
15
|
+
function formatApplicantListItemMarkdown(applicant) {
|
|
16
|
+
const lines = [];
|
|
17
|
+
const name = `${applicant.first_name || ""} ${applicant.last_name || ""}`.trim() || "Unknown";
|
|
18
|
+
lines.push(`## ${name} (${applicant.id})`);
|
|
19
|
+
lines.push("");
|
|
20
|
+
if (applicant.email)
|
|
21
|
+
lines.push(`- **Email**: ${applicant.email}`);
|
|
22
|
+
if (applicant.phone)
|
|
23
|
+
lines.push(`- **Phone**: ${applicant.phone}`);
|
|
24
|
+
if (applicant.dob)
|
|
25
|
+
lines.push(`- **DOB**: ${applicant.dob}`);
|
|
26
|
+
if (applicant.identifier)
|
|
27
|
+
lines.push(`- **Identifier**: ${applicant.identifier}`);
|
|
28
|
+
lines.push("");
|
|
29
|
+
lines.push(`- **Status**: ${applicant.is_active ? "Active" : "Deleted"}`);
|
|
30
|
+
lines.push(`- **Created**: ${applicant.created_date}`);
|
|
31
|
+
return lines.join("\n");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Format full applicant data as Markdown (nested structure from detail endpoint)
|
|
35
|
+
*/
|
|
36
|
+
function formatApplicantMarkdown(applicant) {
|
|
37
|
+
const lines = [];
|
|
38
|
+
const personal = applicant.personal || {};
|
|
39
|
+
lines.push(`## ${personal.first_name || ""} ${personal.last_name || ""} (${applicant.id})`);
|
|
40
|
+
lines.push("");
|
|
41
|
+
if (personal.email)
|
|
42
|
+
lines.push(`- **Email**: ${personal.email}`);
|
|
43
|
+
if (personal.phone)
|
|
44
|
+
lines.push(`- **Phone**: ${personal.phone}`);
|
|
45
|
+
if (personal.dob)
|
|
46
|
+
lines.push(`- **Date of Birth**: ${personal.dob}`);
|
|
47
|
+
if (personal.sex)
|
|
48
|
+
lines.push(`- **Sex**: ${personal.sex}`);
|
|
49
|
+
if (personal.country_of_birth)
|
|
50
|
+
lines.push(`- **Country of Birth**: ${personal.country_of_birth}`);
|
|
51
|
+
if (personal.city_of_birth)
|
|
52
|
+
lines.push(`- **City of Birth**: ${personal.city_of_birth}`);
|
|
53
|
+
if (personal.citizenship?.length) {
|
|
54
|
+
lines.push(`- **Citizenship**: ${personal.citizenship.join(", ")}`);
|
|
55
|
+
}
|
|
56
|
+
lines.push("");
|
|
57
|
+
lines.push(`- **Status**: ${applicant.is_active ? "Active" : "Deleted"}`);
|
|
58
|
+
lines.push(`- **Created**: ${applicant.created_date}`);
|
|
59
|
+
if (applicant.last_modified_date) {
|
|
60
|
+
lines.push(`- **Last Modified**: ${applicant.last_modified_date}`);
|
|
61
|
+
}
|
|
62
|
+
lines.push(`- **Version**: ${applicant.version}`);
|
|
63
|
+
return lines.join("\n");
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Format applicant list as Markdown
|
|
67
|
+
*/
|
|
68
|
+
function formatApplicantsListMarkdown(applicants, total, offset) {
|
|
69
|
+
const lines = [
|
|
70
|
+
"# Applicants List",
|
|
71
|
+
"",
|
|
72
|
+
`Found ${total} applicants (showing ${applicants.length} from offset ${offset})`,
|
|
73
|
+
""
|
|
74
|
+
];
|
|
75
|
+
for (const applicant of applicants) {
|
|
76
|
+
lines.push(formatApplicantListItemMarkdown(applicant));
|
|
77
|
+
lines.push("---");
|
|
78
|
+
lines.push("");
|
|
79
|
+
}
|
|
80
|
+
return lines.join("\n");
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Register applicant tools with the MCP server
|
|
84
|
+
*/
|
|
85
|
+
export function registerApplicantTools(server) {
|
|
86
|
+
// List Applicants Tool
|
|
87
|
+
server.registerTool("formbro_list_applicants", {
|
|
88
|
+
title: "List FormBro Applicants",
|
|
89
|
+
description: `List applicants in the FormBro immigration management system.
|
|
90
|
+
|
|
91
|
+
This tool retrieves a paginated list of applicants with their personal information,
|
|
92
|
+
contact details, and metadata. Supports filtering by search query and program type.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
- limit (number): Maximum results to return, 1-100 (default: 20)
|
|
96
|
+
- offset (number): Number of results to skip for pagination (default: 0)
|
|
97
|
+
- search (string, optional): Search query to filter by name, email, etc.
|
|
98
|
+
- program (string, optional): Filter by program type ('tr', 'pr', 'lmia')
|
|
99
|
+
- response_format ('markdown' | 'json'): Output format (default: 'markdown')
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
Paginated list of applicants with personal information, contact details, and status.
|
|
103
|
+
|
|
104
|
+
Examples:
|
|
105
|
+
- "List all applicants" -> params: {}
|
|
106
|
+
- "Find applicants named John" -> params: { search: "John" }
|
|
107
|
+
- "Get PR program applicants" -> params: { program: "pr" }`,
|
|
108
|
+
inputSchema: ListApplicantsSchema,
|
|
109
|
+
annotations: {
|
|
110
|
+
readOnlyHint: true,
|
|
111
|
+
destructiveHint: false,
|
|
112
|
+
idempotentHint: true,
|
|
113
|
+
openWorldHint: true
|
|
114
|
+
}
|
|
115
|
+
}, async (params) => {
|
|
116
|
+
try {
|
|
117
|
+
const queryParams = {
|
|
118
|
+
skip: params.offset,
|
|
119
|
+
limit: params.limit
|
|
120
|
+
};
|
|
121
|
+
if (params.search)
|
|
122
|
+
queryParams.search = params.search;
|
|
123
|
+
if (params.program)
|
|
124
|
+
queryParams.program = params.program;
|
|
125
|
+
// Backend returns array directly (flattened list items)
|
|
126
|
+
const applicants = await makeApiRequest("/api/applicants", "GET", undefined, queryParams);
|
|
127
|
+
const total = applicants.length;
|
|
128
|
+
if (!applicants.length) {
|
|
129
|
+
return {
|
|
130
|
+
content: [{
|
|
131
|
+
type: "text",
|
|
132
|
+
text: params.search
|
|
133
|
+
? `No applicants found matching '${params.search}'`
|
|
134
|
+
: "No applicants found"
|
|
135
|
+
}]
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
const output = {
|
|
139
|
+
total,
|
|
140
|
+
count: applicants.length,
|
|
141
|
+
offset: params.offset,
|
|
142
|
+
items: applicants.map(a => ({
|
|
143
|
+
id: a.id,
|
|
144
|
+
name: `${a.first_name || ""} ${a.last_name || ""}`.trim() || "Unknown",
|
|
145
|
+
email: a.email,
|
|
146
|
+
phone: a.phone,
|
|
147
|
+
dob: a.dob,
|
|
148
|
+
identifier: a.identifier,
|
|
149
|
+
is_active: a.is_active,
|
|
150
|
+
created_date: a.created_date
|
|
151
|
+
})),
|
|
152
|
+
has_more: total > params.offset + applicants.length,
|
|
153
|
+
...(total > params.offset + applicants.length ? {
|
|
154
|
+
next_offset: params.offset + applicants.length
|
|
155
|
+
} : {})
|
|
156
|
+
};
|
|
157
|
+
let textContent;
|
|
158
|
+
if (params.response_format === ResponseFormat.MARKDOWN) {
|
|
159
|
+
textContent = formatApplicantsListMarkdown(applicants, total, params.offset);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
textContent = JSON.stringify(output, null, 2);
|
|
163
|
+
}
|
|
164
|
+
// Truncate if too large
|
|
165
|
+
if (textContent.length > CHARACTER_LIMIT) {
|
|
166
|
+
textContent = textContent.substring(0, CHARACTER_LIMIT) +
|
|
167
|
+
"\n\n[Response truncated. Use smaller limit or offset to see more results.]";
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
content: [{ type: "text", text: textContent }],
|
|
171
|
+
structuredContent: output
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
return {
|
|
176
|
+
isError: true,
|
|
177
|
+
content: [{ type: "text", text: handleApiError(error) }]
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// Get Single Applicant Tool
|
|
182
|
+
server.registerTool("formbro_get_applicant", {
|
|
183
|
+
title: "Get FormBro Applicant Details",
|
|
184
|
+
description: `Get detailed information about a specific applicant in FormBro.
|
|
185
|
+
|
|
186
|
+
This tool retrieves comprehensive information about an applicant including:
|
|
187
|
+
- Personal information (name, DOB, contact details)
|
|
188
|
+
- Addresses and ID documents
|
|
189
|
+
- Family members and dependents
|
|
190
|
+
- Education and employment history
|
|
191
|
+
- Travel history and other background
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
- id (string): The applicant's unique identifier (MongoDB ObjectId)
|
|
195
|
+
- response_format ('markdown' | 'json'): Output format (default: 'markdown')
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
Complete applicant profile with all available information.
|
|
199
|
+
|
|
200
|
+
Examples:
|
|
201
|
+
- "Get applicant 507f1f77bcf86cd799439011" -> params: { id: "507f1f77bcf86cd799439011" }`,
|
|
202
|
+
inputSchema: IdWithFormatSchema,
|
|
203
|
+
annotations: {
|
|
204
|
+
readOnlyHint: true,
|
|
205
|
+
destructiveHint: false,
|
|
206
|
+
idempotentHint: true,
|
|
207
|
+
openWorldHint: true
|
|
208
|
+
}
|
|
209
|
+
}, async (params) => {
|
|
210
|
+
try {
|
|
211
|
+
const applicant = await makeApiRequest(`/api/applicants/${params.id}`, "GET");
|
|
212
|
+
let textContent;
|
|
213
|
+
if (params.response_format === ResponseFormat.MARKDOWN) {
|
|
214
|
+
const lines = [
|
|
215
|
+
"# Applicant Details",
|
|
216
|
+
"",
|
|
217
|
+
formatApplicantMarkdown(applicant)
|
|
218
|
+
];
|
|
219
|
+
// Add additional sections if available
|
|
220
|
+
if (applicant.education?.length) {
|
|
221
|
+
lines.push("", "### Education", "");
|
|
222
|
+
for (const edu of applicant.education) {
|
|
223
|
+
lines.push(`- ${edu.institution || "Unknown"} (${edu.start_date || "?"} - ${edu.end_date || "present"})`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (applicant.employment?.length) {
|
|
227
|
+
lines.push("", "### Employment", "");
|
|
228
|
+
for (const emp of applicant.employment) {
|
|
229
|
+
lines.push(`- ${emp.employer_name || "Unknown"}: ${emp.job_title || "Unknown"} (${emp.start_date || "?"} - ${emp.end_date || "present"})`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (applicant.family?.length) {
|
|
233
|
+
lines.push("", "### Family Members", "");
|
|
234
|
+
for (const member of applicant.family) {
|
|
235
|
+
lines.push(`- ${member.first_name || ""} ${member.last_name || ""} (${member.relationship || "Unknown"})`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
textContent = lines.join("\n");
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
textContent = JSON.stringify(applicant, null, 2);
|
|
242
|
+
}
|
|
243
|
+
// Truncate if too large
|
|
244
|
+
if (textContent.length > CHARACTER_LIMIT) {
|
|
245
|
+
textContent = textContent.substring(0, CHARACTER_LIMIT) +
|
|
246
|
+
"\n\n[Response truncated due to size. Use JSON format for complete data.]";
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
content: [{ type: "text", text: textContent }],
|
|
250
|
+
structuredContent: applicant
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
return {
|
|
255
|
+
isError: true,
|
|
256
|
+
content: [{ type: "text", text: handleApiError(error) }]
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=applicants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applicants.js","sourceRoot":"","sources":["../../src/tools/applicants.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAGzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlE,yCAAyC;AACzC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,MAAM,CAAC;IACvD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SAChB,QAAQ,EAAE;SACV,QAAQ,CAAC,mDAAmD,CAAC;CACjE,CAAC,CAAC,MAAM,EAAE,CAAC;AAKZ;;GAEG;AACH,SAAS,+BAA+B,CAAC,SAA4B;IACnE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC,UAAU,IAAI,EAAE,IAAI,SAAS,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IAE9F,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,SAAS,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IACnE,IAAI,SAAS,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IACnE,IAAI,SAAS,CAAC,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7D,IAAI,SAAS,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;IAElF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,kBAAkB,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;IAEvD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,SAAoB;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;IAE1C,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,UAAU,IAAI,EAAE,IAAI,QAAQ,CAAC,SAAS,IAAI,EAAE,KAAK,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,QAAQ,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3D,IAAI,QAAQ,CAAC,gBAAgB;QAAE,KAAK,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAClG,IAAI,QAAQ,CAAC,aAAa;QAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IACzF,IAAI,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,kBAAkB,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;IACvD,IAAI,SAAS,CAAC,kBAAkB,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,wBAAwB,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,kBAAkB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAElD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,4BAA4B,CACnC,UAA+B,EAC/B,KAAa,EACb,MAAc;IAEd,MAAM,KAAK,GAAa;QACtB,mBAAmB;QACnB,EAAE;QACF,SAAS,KAAK,wBAAwB,UAAU,CAAC,MAAM,gBAAgB,MAAM,GAAG;QAChF,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,SAAS,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,uBAAuB;IACvB,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE;;;;;;;;;;;;;;;;;;6DAkB0C;QACvD,WAAW,EAAE,oBAAoB;QACjC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,MAA2B,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,WAAW,GAA4B;gBAC3C,IAAI,EAAE,MAAM,CAAC,MAAM;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC;YACF,IAAI,MAAM,CAAC,MAAM;gBAAE,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACtD,IAAI,MAAM,CAAC,OAAO;gBAAE,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAEzD,wDAAwD;YACxD,MAAM,UAAU,GAAG,MAAM,cAAc,CACrC,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CACjD,CAAC;YAEF,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;YAEhC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,MAAM,CAAC,MAAM;gCACjB,CAAC,CAAC,iCAAiC,MAAM,CAAC,MAAM,GAAG;gCACnD,CAAC,CAAC,qBAAqB;yBAC1B,CAAC;iBACH,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG;gBACb,KAAK;gBACL,KAAK,EAAE,UAAU,CAAC,MAAM;gBACxB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC1B,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,SAAS;oBACtE,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,GAAG,EAAE,CAAC,CAAC,GAAG;oBACV,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,YAAY,EAAE,CAAC,CAAC,YAAY;iBAC7B,CAAC,CAAC;gBACH,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;gBACnD,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC9C,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;iBAC/C,CAAC,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;YAEF,IAAI,WAAmB,CAAC;YACxB,IAAI,MAAM,CAAC,eAAe,KAAK,cAAc,CAAC,QAAQ,EAAE,CAAC;gBACvD,WAAW,GAAG,4BAA4B,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,wBAAwB;YACxB,IAAI,WAAW,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBACzC,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC;oBACrD,4EAA4E,CAAC;YACjF,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBAC9C,iBAAiB,EAAE,MAAM;aAC1B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;aACzD,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE;;;;;;;;;;;;;;;;;2FAiBwE;QACrF,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,MAAyB,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,cAAc,CACpC,mBAAmB,MAAM,CAAC,EAAE,EAAE,EAC9B,KAAK,CACN,CAAC;YAEF,IAAI,WAAmB,CAAC;YACxB,IAAI,MAAM,CAAC,eAAe,KAAK,cAAc,CAAC,QAAQ,EAAE,CAAC;gBACvD,MAAM,KAAK,GAAG;oBACZ,qBAAqB;oBACrB,EAAE;oBACF,uBAAuB,CAAC,SAAS,CAAC;iBACnC,CAAC;gBAEF,uCAAuC;gBACvC,IAAI,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;oBAChC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;oBACpC,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,SAA2C,EAAE,CAAC;wBACxE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,IAAI,SAAS,KAAK,GAAG,CAAC,UAAU,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,IAAI,SAAS,GAAG,CAAC,CAAC;oBAC5G,CAAC;gBACH,CAAC;gBAED,IAAI,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;oBACrC,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,UAA4C,EAAE,CAAC;wBACzE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,aAAa,IAAI,SAAS,KAAK,GAAG,CAAC,SAAS,IAAI,SAAS,KAAK,GAAG,CAAC,UAAU,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,IAAI,SAAS,GAAG,CAAC,CAAC;oBAC7I,CAAC;gBACH,CAAC;gBAED,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;oBAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;oBACzC,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,MAAwC,EAAE,CAAC;wBACxE,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,UAAU,IAAI,EAAE,IAAI,MAAM,CAAC,SAAS,IAAI,EAAE,KAAK,MAAM,CAAC,YAAY,IAAI,SAAS,GAAG,CAAC,CAAC;oBAC7G,CAAC;gBACH,CAAC;gBAED,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACnD,CAAC;YAED,wBAAwB;YACxB,IAAI,WAAW,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBACzC,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC;oBACrD,0EAA0E,CAAC;YAC/E,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBAC9C,iBAAiB,EAAE,SAAS;aAC7B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;aACzD,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applications.d.ts","sourceRoot":"","sources":["../../src/tools/applications.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiEpE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4LhE"}
|