@teamso/teamso-mcp 0.0.0-stage → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/LICENSE +21 -0
  3. package/README.md +506 -2
  4. package/dist/client.d.ts +215 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +797 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +32 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/prompts/index.d.ts +12 -0
  13. package/dist/prompts/index.d.ts.map +1 -0
  14. package/dist/prompts/index.js +58 -0
  15. package/dist/prompts/index.js.map +1 -0
  16. package/dist/server.d.ts +28 -0
  17. package/dist/server.d.ts.map +1 -0
  18. package/dist/server.js +58 -0
  19. package/dist/server.js.map +1 -0
  20. package/dist/tools/account.d.ts +4 -0
  21. package/dist/tools/account.d.ts.map +1 -0
  22. package/dist/tools/account.js +34 -0
  23. package/dist/tools/account.js.map +1 -0
  24. package/dist/tools/api.d.ts +13 -0
  25. package/dist/tools/api.d.ts.map +1 -0
  26. package/dist/tools/api.js +982 -0
  27. package/dist/tools/api.js.map +1 -0
  28. package/dist/tools/approvals.d.ts +5 -0
  29. package/dist/tools/approvals.d.ts.map +1 -0
  30. package/dist/tools/approvals.js +120 -0
  31. package/dist/tools/approvals.js.map +1 -0
  32. package/dist/tools/communication.d.ts +4 -0
  33. package/dist/tools/communication.d.ts.map +1 -0
  34. package/dist/tools/communication.js +39 -0
  35. package/dist/tools/communication.js.map +1 -0
  36. package/dist/tools/employees.d.ts +5 -0
  37. package/dist/tools/employees.d.ts.map +1 -0
  38. package/dist/tools/employees.js +113 -0
  39. package/dist/tools/employees.js.map +1 -0
  40. package/dist/tools/help.d.ts +6 -0
  41. package/dist/tools/help.d.ts.map +1 -0
  42. package/dist/tools/help.js +171 -0
  43. package/dist/tools/help.js.map +1 -0
  44. package/dist/tools/index.d.ts +86 -0
  45. package/dist/tools/index.d.ts.map +1 -0
  46. package/dist/tools/index.js +118 -0
  47. package/dist/tools/index.js.map +1 -0
  48. package/dist/tools/leave-support.d.ts +60 -0
  49. package/dist/tools/leave-support.d.ts.map +1 -0
  50. package/dist/tools/leave-support.js +185 -0
  51. package/dist/tools/leave-support.js.map +1 -0
  52. package/dist/tools/leave.d.ts +14 -0
  53. package/dist/tools/leave.d.ts.map +1 -0
  54. package/dist/tools/leave.js +388 -0
  55. package/dist/tools/leave.js.map +1 -0
  56. package/dist/tools/payroll.d.ts +5 -0
  57. package/dist/tools/payroll.d.ts.map +1 -0
  58. package/dist/tools/payroll.js +101 -0
  59. package/dist/tools/payroll.js.map +1 -0
  60. package/dist/tools/performance.d.ts +13 -0
  61. package/dist/tools/performance.d.ts.map +1 -0
  62. package/dist/tools/performance.js +592 -0
  63. package/dist/tools/performance.js.map +1 -0
  64. package/dist/tools/schemas.d.ts +2079 -0
  65. package/dist/tools/schemas.d.ts.map +1 -0
  66. package/dist/tools/schemas.js +460 -0
  67. package/dist/tools/schemas.js.map +1 -0
  68. package/dist/tools/shared.d.ts +20 -0
  69. package/dist/tools/shared.d.ts.map +1 -0
  70. package/dist/tools/shared.js +64 -0
  71. package/dist/tools/shared.js.map +1 -0
  72. package/dist/types.d.ts +545 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/types.js +7 -0
  75. package/dist/types.js.map +1 -0
  76. package/dist/utils/api-endpoints.d.ts +130 -0
  77. package/dist/utils/api-endpoints.d.ts.map +1 -0
  78. package/dist/utils/api-endpoints.js +459 -0
  79. package/dist/utils/api-endpoints.js.map +1 -0
  80. package/dist/utils/dates.d.ts +27 -0
  81. package/dist/utils/dates.d.ts.map +1 -0
  82. package/dist/utils/dates.js +102 -0
  83. package/dist/utils/dates.js.map +1 -0
  84. package/dist/utils/format.d.ts +8 -0
  85. package/dist/utils/format.d.ts.map +1 -0
  86. package/dist/utils/format.js +26 -0
  87. package/dist/utils/format.js.map +1 -0
  88. package/dist/utils/help-search.d.ts +25 -0
  89. package/dist/utils/help-search.d.ts.map +1 -0
  90. package/dist/utils/help-search.js +93 -0
  91. package/dist/utils/help-search.js.map +1 -0
  92. package/dist/utils/json-schema-dialect.d.ts +12 -0
  93. package/dist/utils/json-schema-dialect.d.ts.map +1 -0
  94. package/dist/utils/json-schema-dialect.js +146 -0
  95. package/dist/utils/json-schema-dialect.js.map +1 -0
  96. package/dist/utils/results.d.ts +27 -0
  97. package/dist/utils/results.d.ts.map +1 -0
  98. package/dist/utils/results.js +88 -0
  99. package/dist/utils/results.js.map +1 -0
  100. package/dist/utils/structured.d.ts +89 -0
  101. package/dist/utils/structured.d.ts.map +1 -0
  102. package/dist/utils/structured.js +307 -0
  103. package/dist/utils/structured.js.map +1 -0
  104. package/dist/utils/text.d.ts +12 -0
  105. package/dist/utils/text.d.ts.map +1 -0
  106. package/dist/utils/text.js +46 -0
  107. package/dist/utils/text.js.map +1 -0
  108. package/dist/version.d.ts +3 -0
  109. package/dist/version.d.ts.map +1 -0
  110. package/dist/version.js +6 -0
  111. package/dist/version.js.map +1 -0
  112. package/package.json +86 -4
@@ -0,0 +1,130 @@
1
+ import type { ApiHttpMethod, ApiQueryValue, TeamsoApiEndpointDescription, TeamsoApiEndpointItem, TeamsoApiModule } from '../types.js';
2
+ /**
3
+ * Helpers for the generic API tools: defensive projections of the per-user
4
+ * catalog (`/mcp-catalog`), path and query resolution, request body
5
+ * validation (JSON Schema 2020-12), example arguments and result truncation.
6
+ */
7
+ export declare const SIDE_EFFECTS: readonly ["read", "write", "delete", "read_with_writes"];
8
+ export type SideEffect = typeof SIDE_EFFECTS[number];
9
+ export declare const SMS_MODES: readonly ["always", "conditional", "never"];
10
+ export type SmsMode = typeof SMS_MODES[number];
11
+ export declare const HTTP_METHODS: readonly ["GET", "POST", "PUT", "PATCH", "DELETE"];
12
+ export interface ApiEndpointSummary {
13
+ id: string;
14
+ method: ApiHttpMethod;
15
+ path: string;
16
+ module?: string;
17
+ moduleTitle?: string;
18
+ summary?: string;
19
+ sideEffect: SideEffect;
20
+ smsCodeRequired: SmsMode;
21
+ fileResponse: boolean;
22
+ multipart: boolean;
23
+ access?: string;
24
+ conditional?: boolean;
25
+ }
26
+ export interface ApiSmsRequirement {
27
+ mode: SmsMode;
28
+ when?: string;
29
+ preVerify: boolean;
30
+ credits?: string;
31
+ }
32
+ export interface ApiParameterInfo {
33
+ name: string;
34
+ in: string;
35
+ required: boolean;
36
+ schema: Record<string, unknown>;
37
+ }
38
+ export interface ApiRequestBodyInfo {
39
+ required: boolean;
40
+ validated?: boolean;
41
+ contentType: string;
42
+ /** Self-contained JSON Schema 2020-12 (the catalog's `$defs` merged in). */
43
+ schema: Record<string, unknown>;
44
+ }
45
+ export interface ApiEndpointDetails extends ApiEndpointSummary {
46
+ accessReason?: string;
47
+ permission?: string;
48
+ moduleDescription?: string;
49
+ responseKind?: string;
50
+ doc?: string;
51
+ webScreens: string[];
52
+ sms: ApiSmsRequirement | null;
53
+ parameters: ApiParameterInfo[];
54
+ requestBody: ApiRequestBodyInfo | null;
55
+ notes: string[];
56
+ related: string[];
57
+ }
58
+ export declare function toApiEndpointSummary(item: TeamsoApiEndpointItem): ApiEndpointSummary | null;
59
+ export declare function toApiEndpointDetails(description: TeamsoApiEndpointDescription): ApiEndpointDetails | null;
60
+ export declare function toApiModule(module: TeamsoApiModule): {
61
+ endpointCount: number;
62
+ allowedCount: number;
63
+ description?: string | undefined;
64
+ code: string;
65
+ title: string;
66
+ } | null;
67
+ /** SMS requirement from `smsCode {mode, when, preVerify, credits}`, else from `smsCodeRequired`. */
68
+ export declare function smsRequirementOf(description: TeamsoApiEndpointDescription): ApiSmsRequirement | null;
69
+ /**
70
+ * Unknown or missing values never become `read`: a GET with an unrecognised
71
+ * side effect is handled as a write, so `call_api_read` refuses it.
72
+ */
73
+ export declare function sideEffectOf(value: unknown, method: ApiHttpMethod): SideEffect;
74
+ export declare function normalizeMethod(value: string | undefined): ApiHttpMethod | undefined;
75
+ /** `"POST /leave"` → `{ method: 'POST', path: '/leave' }`. */
76
+ export declare function splitEndpointId(id: string): {
77
+ method: ApiHttpMethod;
78
+ path: string;
79
+ } | null;
80
+ export declare function pathVariables(pattern: string): string[];
81
+ export interface ResolvedPath {
82
+ path: string;
83
+ problems: string[];
84
+ }
85
+ /**
86
+ * Fills `{var}` placeholders. Values travel as single path segments: `/`, `\`, `;`, `%`, control
87
+ * characters and dot-only values are refused (Teamso's firewall rejects them, and they could change
88
+ * the route), never silently rewritten.
89
+ */
90
+ export declare function resolvePath(pattern: string, values?: Record<string, string | number>): ResolvedPath;
91
+ /** Required query parameters that are missing; unknown names are warnings (the API ignores them). */
92
+ export declare function checkQuery(parameters: ApiParameterInfo[], query?: Record<string, ApiQueryValue>): {
93
+ problems: string[];
94
+ warnings: string[];
95
+ };
96
+ /** Path with the query string, for display (`/leave/abc?page=1`). */
97
+ export declare function displayPath(path: string, query?: Record<string, ApiQueryValue>): string;
98
+ export interface BodyValidation {
99
+ /** False when the schema could not be compiled (the body was not checked). */
100
+ checked: boolean;
101
+ valid: boolean;
102
+ errors: string[];
103
+ }
104
+ export declare function validateBody(schema: Record<string, unknown>, value: unknown): BodyValidation;
105
+ /** True for `{type: string, format: binary}` and arrays of it (multipart file parts). */
106
+ export declare function isBinarySchema(schema: unknown): boolean;
107
+ /** A small example value for a schema: required properties first, placeholders for strings. */
108
+ export declare function exampleFromSchema(schema: unknown, root: Record<string, unknown>, depth?: number): unknown;
109
+ export declare const MAX_RESULT_CHARS = 40000;
110
+ export interface ShapedResult {
111
+ result?: unknown;
112
+ truncated: boolean;
113
+ truncation?: {
114
+ originalChars: number;
115
+ arrayPath?: string;
116
+ originalItems?: number;
117
+ returnedItems?: number;
118
+ hint: string;
119
+ };
120
+ /** First characters of the JSON when no list could be shortened. */
121
+ resultPreview?: string;
122
+ }
123
+ /**
124
+ * Keeps results within `maxChars` of JSON. The longest list (the result itself or an array up to
125
+ * two levels down, e.g. `items`, `content`) is cut to the items that fit; the cut is always reported.
126
+ */
127
+ export declare function shapeResult(result: unknown, maxChars?: number): ShapedResult;
128
+ export declare function safeStringify(value: unknown, space?: number): string;
129
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
130
+ //# sourceMappingURL=api-endpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-endpoints.d.ts","sourceRoot":"","sources":["../../src/utils/api-endpoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,459 @@
1
+ import { createRequire } from 'node:module';
2
+ /**
3
+ * Helpers for the generic API tools: defensive projections of the per-user
4
+ * catalog (`/mcp-catalog`), path and query resolution, request body
5
+ * validation (JSON Schema 2020-12), example arguments and result truncation.
6
+ */
7
+ export const SIDE_EFFECTS = ['read', 'write', 'delete', 'read_with_writes'];
8
+ export const SMS_MODES = ['always', 'conditional', 'never'];
9
+ export const HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];
10
+ // ------------------------------------------------------------ projections
11
+ export function toApiEndpointSummary(item) {
12
+ const parsedId = splitEndpointId(stringOf(item.id) ?? '');
13
+ const method = normalizeMethod(stringOf(item.method) ?? parsedId?.method);
14
+ const path = stringOf(item.path) ?? parsedId?.path;
15
+ if (!method || !path)
16
+ return null;
17
+ const sms = smsRequirementOf(item);
18
+ return {
19
+ id: `${method} ${path}`,
20
+ method,
21
+ path,
22
+ ...optional('module', stringOf(item.module)),
23
+ ...optional('moduleTitle', stringOf(item.moduleTitle)),
24
+ ...optional('summary', stringOf(item.summary)),
25
+ sideEffect: sideEffectOf(item.sideEffect, method),
26
+ smsCodeRequired: sms?.mode ?? 'never',
27
+ fileResponse: item.fileResponse === true,
28
+ multipart: item.multipart === true,
29
+ ...optional('access', stringOf(item.access)),
30
+ ...(typeof item.conditional === 'boolean' ? { conditional: item.conditional } : {}),
31
+ };
32
+ }
33
+ export function toApiEndpointDetails(description) {
34
+ const summary = toApiEndpointSummary(description);
35
+ if (!summary)
36
+ return null;
37
+ const defs = isRecord(description.$defs) ? description.$defs : {};
38
+ const parameters = (Array.isArray(description.parameters) ? description.parameters : [])
39
+ .map(toParameterInfo)
40
+ .filter((parameter) => parameter !== null);
41
+ // Every {var} of the path is a required path parameter, even when the catalog forgot one.
42
+ for (const name of pathVariables(summary.path)) {
43
+ if (!parameters.some(parameter => parameter.in === 'path' && parameter.name === name)) {
44
+ parameters.push({ name, in: 'path', required: true, schema: { type: 'string' } });
45
+ }
46
+ }
47
+ const body = isRecord(description.requestBody) ? description.requestBody : null;
48
+ const requestBody = body
49
+ ? {
50
+ required: body.required === true,
51
+ ...(typeof body.validated === 'boolean' ? { validated: body.validated } : {}),
52
+ contentType: stringOf(body.contentType) ?? (summary.multipart ? 'multipart/form-data' : 'application/json'),
53
+ schema: withDefs(isRecord(body.schema) ? body.schema : {}, defs),
54
+ }
55
+ : null;
56
+ return {
57
+ ...summary,
58
+ ...optional('accessReason', stringOf(description.accessReason)),
59
+ ...optional('permission', stringOf(description.permission)),
60
+ ...optional('moduleDescription', stringOf(description.moduleDescription)),
61
+ ...optional('responseKind', stringOf(description.responseKind)),
62
+ ...optional('doc', stringOf(description.doc)),
63
+ webScreens: stringArray(description.webScreens),
64
+ sms: smsRequirementOf(description),
65
+ parameters,
66
+ requestBody,
67
+ notes: stringArray(description.notes),
68
+ related: stringArray(description.related),
69
+ };
70
+ }
71
+ export function toApiModule(module) {
72
+ const code = stringOf(module.code);
73
+ if (!code)
74
+ return null;
75
+ return {
76
+ code,
77
+ title: stringOf(module.title) ?? code,
78
+ ...optional('description', stringOf(module.description)),
79
+ endpointCount: numberOf(module.endpointCount) ?? 0,
80
+ allowedCount: numberOf(module.allowedCount) ?? 0,
81
+ };
82
+ }
83
+ function toParameterInfo(parameter) {
84
+ const name = stringOf(parameter?.name);
85
+ const location = stringOf(parameter?.in);
86
+ if (!name || !location)
87
+ return null;
88
+ return {
89
+ name,
90
+ in: location,
91
+ required: parameter.required === true || location === 'path',
92
+ schema: isRecord(parameter.schema) ? parameter.schema : {},
93
+ };
94
+ }
95
+ /** SMS requirement from `smsCode {mode, when, preVerify, credits}`, else from `smsCodeRequired`. */
96
+ export function smsRequirementOf(description) {
97
+ const detail = isRecord(description.smsCode) ? description.smsCode : null;
98
+ const flag = description.smsCodeRequired;
99
+ let mode = 'never';
100
+ const detailMode = stringOf(detail?.mode)?.toLowerCase();
101
+ const flagMode = typeof flag === 'string' ? flag.toLowerCase() : undefined;
102
+ if (detailMode === 'always' || detailMode === 'conditional')
103
+ mode = detailMode;
104
+ else if (flagMode === 'always' || flagMode === 'conditional')
105
+ mode = flagMode;
106
+ else if (flag === true || (detail && detailMode !== 'never'))
107
+ mode = 'always';
108
+ else if (flagMode && flagMode !== 'never' && flagMode !== 'false')
109
+ mode = 'always';
110
+ if (mode === 'never')
111
+ return null;
112
+ return {
113
+ mode,
114
+ ...optional('when', stringOf(detail?.when)),
115
+ preVerify: detail?.preVerify === true,
116
+ ...optional('credits', stringOf(detail?.credits)),
117
+ };
118
+ }
119
+ /**
120
+ * Unknown or missing values never become `read`: a GET with an unrecognised
121
+ * side effect is handled as a write, so `call_api_read` refuses it.
122
+ */
123
+ export function sideEffectOf(value, method) {
124
+ if (typeof value === 'string' && SIDE_EFFECTS.includes(value))
125
+ return value;
126
+ if (method === 'DELETE')
127
+ return 'delete';
128
+ if (method !== 'GET')
129
+ return 'write';
130
+ return value === undefined || value === null ? 'read' : 'read_with_writes';
131
+ }
132
+ export function normalizeMethod(value) {
133
+ const upper = value?.trim().toUpperCase();
134
+ return upper && HTTP_METHODS.includes(upper) ? upper : undefined;
135
+ }
136
+ /** `"POST /leave"` → `{ method: 'POST', path: '/leave' }`. */
137
+ export function splitEndpointId(id) {
138
+ const match = /^\s*([A-Za-z]+)\s+(\/\S*)\s*$/.exec(id);
139
+ const method = normalizeMethod(match?.[1]);
140
+ if (!match || !method)
141
+ return null;
142
+ return { method, path: match[2] };
143
+ }
144
+ // ------------------------------------------------------------- path/query
145
+ const PATH_VARIABLE = /\{([^{}:]+)(?::[^{}]*)?\}/g;
146
+ export function pathVariables(pattern) {
147
+ return [...pattern.matchAll(PATH_VARIABLE)].map(match => match[1].trim());
148
+ }
149
+ /**
150
+ * Fills `{var}` placeholders. Values travel as single path segments: `/`, `\`, `;`, `%`, control
151
+ * characters and dot-only values are refused (Teamso's firewall rejects them, and they could change
152
+ * the route), never silently rewritten.
153
+ */
154
+ export function resolvePath(pattern, values = {}) {
155
+ const problems = [];
156
+ const names = pathVariables(pattern);
157
+ for (const name of Object.keys(values)) {
158
+ if (!names.includes(name)) {
159
+ problems.push(`path_params.${name} is not a placeholder of ${pattern}`
160
+ + (names.length ? ` (placeholders: ${names.map(item => `{${item}}`).join(', ')})` : ' (it has none)') + '.');
161
+ }
162
+ }
163
+ const path = pattern.replace(PATH_VARIABLE, (_whole, rawName) => {
164
+ const name = rawName.trim();
165
+ const raw = values[name];
166
+ if (raw === undefined || raw === null || String(raw).trim() === '') {
167
+ problems.push(`path_params.${name} is required (it fills {${name}} in ${pattern}).`);
168
+ return `{${name}}`;
169
+ }
170
+ const value = String(raw).trim();
171
+ if (value.length > 500 || /[/\\;%\u0000-\u001f\u007f]/.test(value) || /^\.+$/.test(value)) {
172
+ problems.push(`path_params.${name} cannot be sent as a URL path segment (no "/", "\\", ";", "%", `
173
+ + 'control characters or dot-only values, at most 500 characters).');
174
+ return `{${name}}`;
175
+ }
176
+ return encodeURIComponent(value).replace(/%3A/gi, ':');
177
+ });
178
+ return { path, problems };
179
+ }
180
+ /** Required query parameters that are missing; unknown names are warnings (the API ignores them). */
181
+ export function checkQuery(parameters, query = {}) {
182
+ const problems = [];
183
+ const warnings = [];
184
+ const known = parameters.filter(parameter => parameter.in === 'query');
185
+ for (const parameter of known) {
186
+ const value = query[parameter.name];
187
+ const missing = value === undefined || value === '' || (Array.isArray(value) && value.length === 0);
188
+ if (parameter.required && missing && parameter.schema.default === undefined) {
189
+ problems.push(`query.${parameter.name} is required${describeType(parameter.schema)}.`);
190
+ }
191
+ }
192
+ for (const name of Object.keys(query)) {
193
+ if (!known.some(parameter => parameter.name === name)) {
194
+ warnings.push(`query.${name} is not a documented parameter of this endpoint; Teamso may ignore it.`);
195
+ }
196
+ }
197
+ for (const parameter of parameters) {
198
+ if (parameter.in === 'header' && parameter.required && parameter.schema.default === undefined) {
199
+ warnings.push(`This endpoint expects the header \`${parameter.name}\`, which MCP tools do not send; `
200
+ + 'the call may fail. Use the Teamso app for it.');
201
+ }
202
+ }
203
+ return { problems, warnings };
204
+ }
205
+ function describeType(schema) {
206
+ const parts = [stringOf(schema.type), stringOf(schema['x-pattern']) ?? stringOf(schema.format)].filter(Boolean);
207
+ return parts.length ? ` (${parts.join(', ')})` : '';
208
+ }
209
+ /** Path with the query string, for display (`/leave/abc?page=1`). */
210
+ export function displayPath(path, query = {}) {
211
+ const params = new URLSearchParams();
212
+ for (const [key, value] of Object.entries(query)) {
213
+ if (value === undefined || value === null || value === '')
214
+ continue;
215
+ for (const item of Array.isArray(value) ? value : [value])
216
+ params.append(key, String(item));
217
+ }
218
+ const search = params.toString();
219
+ return search ? `${path}?${search}` : path;
220
+ }
221
+ let ajv;
222
+ function getAjv() {
223
+ if (!ajv) {
224
+ const require = createRequire(import.meta.url);
225
+ const loaded = require('ajv/dist/2020');
226
+ const Ajv2020 = loaded.default ?? loaded;
227
+ // Teamso dates are not RFC 3339 (`yyyy-MM-dd HH:mm`) and `x-*` keywords are hints: check
228
+ // structure, types, enums and bounds, not formats.
229
+ ajv = new Ajv2020({ strict: false, allErrors: true, validateFormats: false, logger: false });
230
+ }
231
+ return ajv;
232
+ }
233
+ const MAX_VALIDATION_ERRORS = 20;
234
+ export function validateBody(schema, value) {
235
+ const instance = getAjv();
236
+ let validate;
237
+ try {
238
+ validate = instance.compile(schema);
239
+ }
240
+ catch {
241
+ return { checked: false, valid: true, errors: [] };
242
+ }
243
+ try {
244
+ const valid = validate(value);
245
+ const errors = (validate.errors ?? []).slice(0, MAX_VALIDATION_ERRORS).map(formatAjvError);
246
+ return { checked: true, valid, errors: valid ? [] : errors };
247
+ }
248
+ finally {
249
+ // Compiled schemas are cached by object; drop it so a long-running server does not grow.
250
+ try {
251
+ instance.removeSchema(schema);
252
+ }
253
+ catch {
254
+ // nothing cached
255
+ }
256
+ }
257
+ }
258
+ function formatAjvError(error) {
259
+ const location = `body${String(error.instancePath ?? '').replace(/\//g, '.')}`;
260
+ const params = isRecord(error.params) ? error.params : {};
261
+ if (error.keyword === 'required' && params.missingProperty) {
262
+ return `${location}.${String(params.missingProperty)} is required.`;
263
+ }
264
+ if (error.keyword === 'enum' && Array.isArray(params.allowedValues)) {
265
+ return `${location} must be one of ${params.allowedValues.map(item => JSON.stringify(item)).join(', ')}.`;
266
+ }
267
+ if (error.keyword === 'additionalProperties' && params.additionalProperty) {
268
+ return `${location}.${String(params.additionalProperty)} is not allowed.`;
269
+ }
270
+ return `${location} ${String(error.message ?? 'is invalid')}.`;
271
+ }
272
+ function withDefs(schema, defs) {
273
+ const merged = { ...schema };
274
+ if (Object.keys(defs).length > 0) {
275
+ merged.$defs = { ...(isRecord(schema.$defs) ? schema.$defs : {}), ...defs };
276
+ }
277
+ return merged;
278
+ }
279
+ /** True for `{type: string, format: binary}` and arrays of it (multipart file parts). */
280
+ export function isBinarySchema(schema) {
281
+ if (!isRecord(schema))
282
+ return false;
283
+ if (schema.format === 'binary')
284
+ return true;
285
+ return schema.type === 'array' && isBinarySchema(schema.items);
286
+ }
287
+ // ---------------------------------------------------------------- examples
288
+ const MAX_EXAMPLE_DEPTH = 4;
289
+ const MAX_EXAMPLE_PROPERTIES = 12;
290
+ /** A small example value for a schema: required properties first, placeholders for strings. */
291
+ export function exampleFromSchema(schema, root, depth = 0) {
292
+ if (!isRecord(schema))
293
+ return null;
294
+ if (schema.default !== undefined)
295
+ return schema.default;
296
+ if (Array.isArray(schema.examples) && schema.examples.length)
297
+ return schema.examples[0];
298
+ if (Array.isArray(schema.enum) && schema.enum.length)
299
+ return schema.enum[0];
300
+ const ref = stringOf(schema.$ref);
301
+ if (ref) {
302
+ if (depth >= MAX_EXAMPLE_DEPTH)
303
+ return {};
304
+ return exampleFromSchema(resolveRef(ref, root), root, depth + 1);
305
+ }
306
+ const type = Array.isArray(schema.type) ? schema.type.find(item => item !== 'null') : schema.type;
307
+ switch (type) {
308
+ case 'string': {
309
+ const pattern = stringOf(schema['x-pattern']);
310
+ if (schema.format === 'binary')
311
+ return '<file>';
312
+ if (pattern)
313
+ return `<${pattern}>`;
314
+ if (schema.format === 'date')
315
+ return '<yyyy-MM-dd>';
316
+ if (schema.format === 'date-time')
317
+ return '<yyyy-MM-dd HH:mm>';
318
+ if (schema.format === 'email')
319
+ return '<email>';
320
+ return '<string>';
321
+ }
322
+ case 'integer':
323
+ case 'number':
324
+ return typeof schema.minimum === 'number' ? schema.minimum : 0;
325
+ case 'boolean':
326
+ return false;
327
+ case 'array':
328
+ return depth >= MAX_EXAMPLE_DEPTH ? [] : [exampleFromSchema(schema.items, root, depth + 1)];
329
+ case 'object':
330
+ default: {
331
+ if (!isRecord(schema.properties))
332
+ return type === 'object' || schema['x-open-object'] ? {} : null;
333
+ if (depth >= MAX_EXAMPLE_DEPTH)
334
+ return {};
335
+ const required = stringArray(schema.required);
336
+ const names = required.length
337
+ ? required
338
+ : Object.keys(schema.properties).slice(0, MAX_EXAMPLE_PROPERTIES);
339
+ const example = {};
340
+ for (const name of names.slice(0, MAX_EXAMPLE_PROPERTIES)) {
341
+ example[name] = exampleFromSchema(schema.properties[name], root, depth + 1);
342
+ }
343
+ return example;
344
+ }
345
+ }
346
+ }
347
+ function resolveRef(ref, root) {
348
+ if (!ref.startsWith('#/'))
349
+ return undefined;
350
+ let node = root;
351
+ for (const part of ref.slice(2).split('/')) {
352
+ if (!isRecord(node))
353
+ return undefined;
354
+ node = node[part.replace(/~1/g, '/').replace(/~0/g, '~')];
355
+ }
356
+ return node;
357
+ }
358
+ // -------------------------------------------------------------- truncation
359
+ export const MAX_RESULT_CHARS = 40_000;
360
+ const PAGING_HINT = 'Ask for less: use the endpoint\'s paging or filter parameters (e.g. `page`/`size` or a '
361
+ + 'search value in `query`, see describe_api_endpoint) and call again.';
362
+ /**
363
+ * Keeps results within `maxChars` of JSON. The longest list (the result itself or an array up to
364
+ * two levels down, e.g. `items`, `content`) is cut to the items that fit; the cut is always reported.
365
+ */
366
+ export function shapeResult(result, maxChars = MAX_RESULT_CHARS) {
367
+ const json = safeStringify(result);
368
+ if (json.length <= maxChars)
369
+ return { result, truncated: false };
370
+ const candidate = largestArray(result);
371
+ if (candidate) {
372
+ const { path, array } = candidate;
373
+ let low = 0;
374
+ let high = array.length;
375
+ while (low < high) {
376
+ const middle = Math.ceil((low + high) / 2);
377
+ const size = safeStringify(replaceAt(result, path, array.slice(0, middle))).length;
378
+ if (size <= maxChars)
379
+ low = middle;
380
+ else
381
+ high = middle - 1;
382
+ }
383
+ if (low > 0) {
384
+ return {
385
+ result: replaceAt(result, path, array.slice(0, low)),
386
+ truncated: true,
387
+ truncation: {
388
+ originalChars: json.length,
389
+ arrayPath: path.length ? path.join('.') : '(result)',
390
+ originalItems: array.length,
391
+ returnedItems: low,
392
+ hint: `Only the first ${low} of ${array.length} items are included. ${PAGING_HINT}`,
393
+ },
394
+ };
395
+ }
396
+ }
397
+ return {
398
+ truncated: true,
399
+ truncation: {
400
+ originalChars: json.length,
401
+ hint: `The result is ${json.length} characters of JSON; only the first ${maxChars} are in resultPreview. `
402
+ + PAGING_HINT,
403
+ },
404
+ resultPreview: json.slice(0, maxChars),
405
+ };
406
+ }
407
+ function largestArray(value) {
408
+ let best = null;
409
+ const consider = (path, node) => {
410
+ if (!Array.isArray(node) || node.length < 2)
411
+ return;
412
+ const size = safeStringify(node).length;
413
+ if (!best || size > best.size)
414
+ best = { path, array: node, size };
415
+ };
416
+ consider([], value);
417
+ if (isRecord(value)) {
418
+ for (const [key, child] of Object.entries(value)) {
419
+ consider([key], child);
420
+ if (isRecord(child)) {
421
+ for (const [innerKey, inner] of Object.entries(child))
422
+ consider([key, innerKey], inner);
423
+ }
424
+ }
425
+ }
426
+ return best;
427
+ }
428
+ function replaceAt(value, path, replacement) {
429
+ if (path.length === 0)
430
+ return replacement;
431
+ const [head, ...rest] = path;
432
+ const record = value;
433
+ return { ...record, [head]: replaceAt(record[head], rest, replacement) };
434
+ }
435
+ export function safeStringify(value, space) {
436
+ try {
437
+ return JSON.stringify(value === undefined ? null : value, null, space) ?? 'null';
438
+ }
439
+ catch {
440
+ return '"[unserializable]"';
441
+ }
442
+ }
443
+ // ------------------------------------------------------------------ utils
444
+ function stringOf(value) {
445
+ return typeof value === 'string' && value.trim() !== '' ? value : undefined;
446
+ }
447
+ function numberOf(value) {
448
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
449
+ }
450
+ function stringArray(value) {
451
+ return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
452
+ }
453
+ function optional(key, value) {
454
+ return (value === undefined ? {} : { [key]: value });
455
+ }
456
+ export function isRecord(value) {
457
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
458
+ }
459
+ //# sourceMappingURL=api-endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-endpoints.js","sourceRoot":"","sources":["../../src/utils/api-endpoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare const DEFAULT_WORKDAY_START = "09:00";
2
+ export declare const DEFAULT_WORKDAY_END = "18:00";
3
+ export interface WallClockInput {
4
+ /** `yyyy-MM-dd`. */
5
+ date: string;
6
+ /** `HH:mm`, or undefined when only a date was given. */
7
+ time?: string;
8
+ }
9
+ /** Parses `yyyy-MM-dd`, `yyyy-MM-dd HH:mm` or `yyyy-MM-ddTHH:mm[:ss]`; throws a readable error otherwise. */
10
+ export declare function parseWallClock(value: string, field: string): WallClockInput;
11
+ export declare function formatWallClock(date: string, time: string): string;
12
+ /** `HH:mm` from `HH:mm[:ss]`, or undefined. */
13
+ export declare function toClockTime(value: string | null | undefined): string | undefined;
14
+ export declare const TEAMSO_TIME_ZONE = "Europe/Istanbul";
15
+ /**
16
+ * `yyyy-MM-dd` from an API date. Instants (epoch millis, ISO strings with an
17
+ * offset) are read on the Turkey calendar, so a midnight stored in either UTC
18
+ * or Turkey time lands on the intended day; wall-clock strings
19
+ * (`yyyy-MM-dd[ HH:mm]`) are taken as they are.
20
+ */
21
+ export declare function toIsoDay(value: string | number | null | undefined): string | undefined;
22
+ /**
23
+ * API date-time for display. Instants become Turkey wall clock
24
+ * (`yyyy-MM-dd HH:mm`), matching the leave dates; other strings are kept.
25
+ */
26
+ export declare function toDisplayDateTime(value: string | number | null | undefined): string | undefined;
27
+ //# sourceMappingURL=dates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../src/utils/dates.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAC7C,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,6GAA6G;AAC7G,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAmB3E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKhF;AAED,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AA+BlD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAOtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAK/F"}