@calltelemetry/cli 0.15.1 → 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/README.md +33 -0
- package/dist/commands/sftp.d.ts +3 -0
- package/dist/commands/sftp.d.ts.map +1 -0
- package/dist/commands/sftp.js +1586 -0
- package/dist/commands/sftp.js.map +1 -0
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/appliance-api.d.ts +149 -0
- package/dist/lib/appliance-api.d.ts.map +1 -0
- package/dist/lib/appliance-api.js +492 -0
- package/dist/lib/appliance-api.js.map +1 -0
- package/dist/lib/openapi.d.ts +129 -0
- package/dist/lib/openapi.d.ts.map +1 -0
- package/dist/lib/openapi.js +325 -0
- package/dist/lib/openapi.js.map +1 -0
- package/dist/lib/sftp.d.ts +231 -0
- package/dist/lib/sftp.d.ts.map +1 -0
- package/dist/lib/sftp.js +439 -0
- package/dist/lib/sftp.js.map +1 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/lib/version.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +2 -0
- package/dist/program.js.map +1 -1
- package/dist/utils/prompt.d.ts +14 -0
- package/dist/utils/prompt.d.ts.map +1 -1
- package/dist/utils/prompt.js +28 -0
- package/dist/utils/prompt.js.map +1 -1
- package/dist/utils/table.d.ts +18 -0
- package/dist/utils/table.d.ts.map +1 -0
- package/dist/utils/table.js +97 -0
- package/dist/utils/table.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime OpenAPI helpers for appliance APIs.
|
|
3
|
+
*
|
|
4
|
+
* The appliance serves the spec generated during its build at `/api/openapi`
|
|
5
|
+
* (and `/api/openapi.json`). The CLI reads that spec from the running release
|
|
6
|
+
* instead of bundling a snapshot, so SFTP commands follow whatever routes and
|
|
7
|
+
* request shapes the installed appliance actually exposes.
|
|
8
|
+
*/
|
|
9
|
+
export const HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete'];
|
|
10
|
+
const ORG_PREFIX = '/api/org/{org_id}/';
|
|
11
|
+
function isObject(value) {
|
|
12
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
function normalizePath(path) {
|
|
15
|
+
const trimmed = path.trim();
|
|
16
|
+
if (!trimmed)
|
|
17
|
+
return '/';
|
|
18
|
+
return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
19
|
+
}
|
|
20
|
+
export function shortPath(path) {
|
|
21
|
+
if (path.startsWith(ORG_PREFIX))
|
|
22
|
+
return path.slice(ORG_PREFIX.length);
|
|
23
|
+
if (path.startsWith('/api/'))
|
|
24
|
+
return path.slice(5);
|
|
25
|
+
return path.replace(/^\//, '');
|
|
26
|
+
}
|
|
27
|
+
/** Resolve `$ref` and merge `allOf` branches into one schema. */
|
|
28
|
+
export function resolveSchema(doc, schema, seen = new Set()) {
|
|
29
|
+
if (!schema)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (schema.$ref) {
|
|
32
|
+
if (seen.has(schema.$ref))
|
|
33
|
+
return schema;
|
|
34
|
+
seen.add(schema.$ref);
|
|
35
|
+
const ref = schema.$ref;
|
|
36
|
+
if (ref.startsWith('#/components/schemas/')) {
|
|
37
|
+
const name = ref.slice('#/components/schemas/'.length);
|
|
38
|
+
const target = doc.components?.schemas?.[name];
|
|
39
|
+
if (!target)
|
|
40
|
+
return schema;
|
|
41
|
+
return resolveSchema(doc, target, seen);
|
|
42
|
+
}
|
|
43
|
+
return schema;
|
|
44
|
+
}
|
|
45
|
+
if (schema.allOf && schema.allOf.length > 0) {
|
|
46
|
+
const merged = {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {},
|
|
49
|
+
required: [],
|
|
50
|
+
};
|
|
51
|
+
for (const branch of schema.allOf) {
|
|
52
|
+
const resolved = resolveSchema(doc, branch, new Set(seen));
|
|
53
|
+
if (!resolved)
|
|
54
|
+
continue;
|
|
55
|
+
if (resolved.type && !merged.type)
|
|
56
|
+
merged.type = resolved.type;
|
|
57
|
+
Object.assign(merged.properties, resolved.properties ?? {});
|
|
58
|
+
if (resolved.required)
|
|
59
|
+
merged.required.push(...resolved.required);
|
|
60
|
+
if (resolved.additionalProperties !== undefined) {
|
|
61
|
+
merged.additionalProperties = resolved.additionalProperties;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Keep any sibling keywords from the outer schema.
|
|
65
|
+
if (schema.properties)
|
|
66
|
+
Object.assign(merged.properties, schema.properties);
|
|
67
|
+
if (schema.required)
|
|
68
|
+
merged.required.push(...schema.required);
|
|
69
|
+
if (schema.description)
|
|
70
|
+
merged.description = schema.description;
|
|
71
|
+
return merged;
|
|
72
|
+
}
|
|
73
|
+
return schema;
|
|
74
|
+
}
|
|
75
|
+
function pathTemplateToRegex(path) {
|
|
76
|
+
const names = [];
|
|
77
|
+
const escaped = path.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
78
|
+
const pattern = escaped.replace(/\\\{([^}]+)\\\}/g, (_match, name) => {
|
|
79
|
+
names.push(name);
|
|
80
|
+
return '([^/]+)';
|
|
81
|
+
});
|
|
82
|
+
return { regex: new RegExp(`^${pattern}$`), names };
|
|
83
|
+
}
|
|
84
|
+
/** Find the best matching path template, including concrete paths with IDs. */
|
|
85
|
+
function findPathTemplate(doc, candidatePath) {
|
|
86
|
+
const paths = doc.paths ?? {};
|
|
87
|
+
if (paths[candidatePath])
|
|
88
|
+
return { template: candidatePath, extractedParams: {} };
|
|
89
|
+
for (const template of Object.keys(paths)) {
|
|
90
|
+
const { regex, names } = pathTemplateToRegex(template);
|
|
91
|
+
const match = regex.exec(candidatePath);
|
|
92
|
+
if (!match)
|
|
93
|
+
continue;
|
|
94
|
+
const extractedParams = {};
|
|
95
|
+
names.forEach((name, index) => {
|
|
96
|
+
extractedParams[name] = decodeURIComponent(match[index + 1] ?? '');
|
|
97
|
+
});
|
|
98
|
+
return { template, extractedParams };
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
function parseMethodPrefix(ref) {
|
|
103
|
+
const match = ref.trim().match(/^(GET|POST|PUT|PATCH|DELETE)\s+(.+)$/i);
|
|
104
|
+
if (!match)
|
|
105
|
+
return { rest: ref.trim() };
|
|
106
|
+
const method = match[1].toLowerCase();
|
|
107
|
+
return { method, rest: match[2].trim() };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Resolve an operation reference.
|
|
111
|
+
*
|
|
112
|
+
* Accepts:
|
|
113
|
+
* `sftp_action_accounts/{id}/quota`
|
|
114
|
+
* `GET sftp_action_accounts/{id}/quota`
|
|
115
|
+
* `GET /api/org/{org_id}/sftp_action_accounts/{id}/quota`
|
|
116
|
+
* `sftp_action_accounts/12/quota` (concrete IDs)
|
|
117
|
+
*/
|
|
118
|
+
export function getOperation(doc, ref) {
|
|
119
|
+
const { method: explicitMethod, rest } = parseMethodPrefix(ref);
|
|
120
|
+
const candidates = new Set();
|
|
121
|
+
const normalized = normalizePath(rest);
|
|
122
|
+
candidates.add(normalized);
|
|
123
|
+
if (!normalized.startsWith('/api/')) {
|
|
124
|
+
candidates.add(`/api/${normalized.replace(/^\//, '')}`);
|
|
125
|
+
candidates.add(`${ORG_PREFIX}${normalized.replace(/^\//, '')}`);
|
|
126
|
+
}
|
|
127
|
+
else if (normalized.startsWith('/api/org/') && !normalized.startsWith(ORG_PREFIX)) {
|
|
128
|
+
// Concrete org ID: /api/org/2/sftp_action_accounts
|
|
129
|
+
const withoutOrg = normalized.replace(/^\/api\/org\/[^/]+\//, '');
|
|
130
|
+
candidates.add(`${ORG_PREFIX}${withoutOrg}`);
|
|
131
|
+
}
|
|
132
|
+
let match = null;
|
|
133
|
+
for (const candidate of candidates) {
|
|
134
|
+
match = findPathTemplate(doc, candidate);
|
|
135
|
+
if (match)
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
if (!match) {
|
|
139
|
+
throw new Error(`Operation not found in the appliance OpenAPI spec: ${rest}`);
|
|
140
|
+
}
|
|
141
|
+
const pathItem = doc.paths?.[match.template] ?? {};
|
|
142
|
+
const methods = HTTP_METHODS.filter(candidate => pathItem[candidate] !== undefined);
|
|
143
|
+
let method = explicitMethod;
|
|
144
|
+
if (!method) {
|
|
145
|
+
if (methods.length === 1) {
|
|
146
|
+
method = methods[0];
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
throw new Error(`Operation "${shortPath(match.template)}" supports multiple methods (${methods
|
|
150
|
+
.map(m => m.toUpperCase())
|
|
151
|
+
.join(', ')}). Specify one, e.g. "GET ${shortPath(match.template)}".`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const operation = pathItem[method];
|
|
155
|
+
if (!operation) {
|
|
156
|
+
throw new Error(`Method ${method.toUpperCase()} is not available for "${shortPath(match.template)}" ` +
|
|
157
|
+
`on this appliance release (available: ${methods.map(m => m.toUpperCase()).join(', ') || 'none'}).`);
|
|
158
|
+
}
|
|
159
|
+
const pathParameters = pathItem.parameters ?? [];
|
|
160
|
+
const mergedOperation = pathParameters.length > 0
|
|
161
|
+
? {
|
|
162
|
+
...operation,
|
|
163
|
+
parameters: [...pathParameters, ...(operation.parameters ?? [])],
|
|
164
|
+
}
|
|
165
|
+
: operation;
|
|
166
|
+
return {
|
|
167
|
+
path: match.template,
|
|
168
|
+
shortPath: shortPath(match.template),
|
|
169
|
+
method,
|
|
170
|
+
operation: mergedOperation,
|
|
171
|
+
extractedParams: match.extractedParams,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
export function hasOperation(doc, ref) {
|
|
175
|
+
try {
|
|
176
|
+
getOperation(doc, ref);
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
export function listOperations(doc, options = {}) {
|
|
184
|
+
const entries = [];
|
|
185
|
+
const needle = options.contains?.toLowerCase();
|
|
186
|
+
for (const [path, operations] of Object.entries(doc.paths ?? {})) {
|
|
187
|
+
if (needle && !path.toLowerCase().includes(needle))
|
|
188
|
+
continue;
|
|
189
|
+
for (const method of HTTP_METHODS) {
|
|
190
|
+
const operation = operations?.[method];
|
|
191
|
+
if (!operation)
|
|
192
|
+
continue;
|
|
193
|
+
entries.push({
|
|
194
|
+
path,
|
|
195
|
+
shortPath: shortPath(path),
|
|
196
|
+
method,
|
|
197
|
+
operationId: operation.operationId,
|
|
198
|
+
summary: operation.summary ?? operation.operationId ?? '',
|
|
199
|
+
tags: operation.tags ?? [],
|
|
200
|
+
hasBody: operation.requestBody !== undefined,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return entries.sort((a, b) => a.shortPath.localeCompare(b.shortPath) || a.method.localeCompare(b.method));
|
|
205
|
+
}
|
|
206
|
+
export function operationPathParams(operation) {
|
|
207
|
+
return (operation.parameters ?? []).filter(p => p.in === 'path');
|
|
208
|
+
}
|
|
209
|
+
/** Every `{name}` placeholder in a path template, in order. */
|
|
210
|
+
export function pathPlaceholders(path) {
|
|
211
|
+
return Array.from(path.matchAll(/\{([^}]+)\}/g), match => match[1]);
|
|
212
|
+
}
|
|
213
|
+
export function operationQueryParams(operation) {
|
|
214
|
+
return (operation.parameters ?? []).filter(p => p.in === 'query');
|
|
215
|
+
}
|
|
216
|
+
export function operationBodyContentType(operation) {
|
|
217
|
+
const content = operation.requestBody?.content;
|
|
218
|
+
if (!content)
|
|
219
|
+
return null;
|
|
220
|
+
for (const contentType of ['application/json', 'multipart/form-data']) {
|
|
221
|
+
if (content[contentType]) {
|
|
222
|
+
return { contentType, schema: content[contentType]?.schema };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const first = Object.keys(content)[0];
|
|
226
|
+
if (!first)
|
|
227
|
+
return null;
|
|
228
|
+
return { contentType: first, schema: content[first]?.schema };
|
|
229
|
+
}
|
|
230
|
+
export function operationBodySchema(doc, operation) {
|
|
231
|
+
const body = operationBodyContentType(operation);
|
|
232
|
+
return resolveSchema(doc, body?.schema);
|
|
233
|
+
}
|
|
234
|
+
function typeMatches(type, value) {
|
|
235
|
+
if (!type)
|
|
236
|
+
return true;
|
|
237
|
+
switch (type) {
|
|
238
|
+
case 'object':
|
|
239
|
+
return isObject(value);
|
|
240
|
+
case 'array':
|
|
241
|
+
return Array.isArray(value);
|
|
242
|
+
case 'string':
|
|
243
|
+
return typeof value === 'string';
|
|
244
|
+
case 'integer':
|
|
245
|
+
return typeof value === 'number' && Number.isInteger(value);
|
|
246
|
+
case 'number':
|
|
247
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
248
|
+
case 'boolean':
|
|
249
|
+
return typeof value === 'boolean';
|
|
250
|
+
case 'null':
|
|
251
|
+
return value === null;
|
|
252
|
+
default:
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Validate a value against an OpenAPI schema. Returns human-readable errors.
|
|
258
|
+
* Intentionally permissive for constructs the CLI cannot usefully check.
|
|
259
|
+
*/
|
|
260
|
+
export function validateAgainstSchema(doc, schema, value, path = 'body', depth = 0) {
|
|
261
|
+
if (!schema || depth > 20)
|
|
262
|
+
return [];
|
|
263
|
+
const resolved = resolveSchema(doc, schema);
|
|
264
|
+
if (!resolved)
|
|
265
|
+
return [];
|
|
266
|
+
if (value === null || value === undefined) {
|
|
267
|
+
return [];
|
|
268
|
+
}
|
|
269
|
+
const errors = [];
|
|
270
|
+
if (resolved.oneOf && resolved.oneOf.length > 0) {
|
|
271
|
+
const branches = resolved.oneOf.map(branch => validateAgainstSchema(doc, branch, value, path, depth + 1));
|
|
272
|
+
if (!branches.some(branchErrors => branchErrors.length === 0)) {
|
|
273
|
+
errors.push(`${path} does not match any allowed shape`);
|
|
274
|
+
}
|
|
275
|
+
return errors;
|
|
276
|
+
}
|
|
277
|
+
if (resolved.anyOf && resolved.anyOf.length > 0) {
|
|
278
|
+
const branches = resolved.anyOf.map(branch => validateAgainstSchema(doc, branch, value, path, depth + 1));
|
|
279
|
+
if (!branches.some(branchErrors => branchErrors.length === 0)) {
|
|
280
|
+
errors.push(`${path} does not match any allowed shape`);
|
|
281
|
+
}
|
|
282
|
+
return errors;
|
|
283
|
+
}
|
|
284
|
+
if (resolved.type && !typeMatches(resolved.type, value)) {
|
|
285
|
+
errors.push(`${path} must be of type ${resolved.type}`);
|
|
286
|
+
return errors;
|
|
287
|
+
}
|
|
288
|
+
if (resolved.enum && !resolved.enum.some(option => option === value)) {
|
|
289
|
+
errors.push(`${path} must be one of: ${resolved.enum.map(v => JSON.stringify(v)).join(', ')}`);
|
|
290
|
+
}
|
|
291
|
+
if (resolved.type === 'object' || resolved.properties) {
|
|
292
|
+
if (!isObject(value))
|
|
293
|
+
return errors;
|
|
294
|
+
for (const requiredKey of resolved.required ?? []) {
|
|
295
|
+
if (value[requiredKey] === undefined || value[requiredKey] === null) {
|
|
296
|
+
errors.push(`${path}.${requiredKey} is required`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
for (const [key, propertySchema] of Object.entries(resolved.properties ?? {})) {
|
|
300
|
+
if (value[key] === undefined)
|
|
301
|
+
continue;
|
|
302
|
+
errors.push(...validateAgainstSchema(doc, propertySchema, value[key], `${path}.${key}`, depth + 1));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (resolved.type === 'array' && Array.isArray(value) && resolved.items) {
|
|
306
|
+
value.forEach((item, index) => {
|
|
307
|
+
errors.push(...validateAgainstSchema(doc, resolved.items, item, `${path}[${index}]`, depth + 1));
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
return errors;
|
|
311
|
+
}
|
|
312
|
+
/** Compact one-line description of a schema's fields, used in errors/help output. */
|
|
313
|
+
export function describeSchema(doc, schema) {
|
|
314
|
+
const resolved = resolveSchema(doc, schema);
|
|
315
|
+
if (!resolved)
|
|
316
|
+
return 'no body';
|
|
317
|
+
if (resolved.type === 'object' || resolved.properties) {
|
|
318
|
+
const required = new Set(resolved.required ?? []);
|
|
319
|
+
return Object.keys(resolved.properties ?? {})
|
|
320
|
+
.map(key => `${key}${required.has(key) ? '!' : ''}`)
|
|
321
|
+
.join(', ');
|
|
322
|
+
}
|
|
323
|
+
return resolved.type ?? 'unknown';
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=openapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/lib/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SFTP Action Account domain helpers.
|
|
3
|
+
*
|
|
4
|
+
* Paths and response envelopes here match the appliance OpenAPI contract
|
|
5
|
+
* (`sftp_action_accounts`, `sftp_monitoring`, `sftp_storage`, ...). Every
|
|
6
|
+
* command checks the live spec first so a missing route on an older release
|
|
7
|
+
* produces an actionable message instead of a raw 404.
|
|
8
|
+
*/
|
|
9
|
+
import { ApplianceApi } from './appliance-api.js';
|
|
10
|
+
import { type OpenApiDocument, type ResolvedOperation } from './openapi.js';
|
|
11
|
+
export interface SftpAction {
|
|
12
|
+
type: string;
|
|
13
|
+
target?: string | null;
|
|
14
|
+
params?: Record<string, unknown> | null;
|
|
15
|
+
}
|
|
16
|
+
export interface SftpAccount {
|
|
17
|
+
id: number;
|
|
18
|
+
org_id: number;
|
|
19
|
+
username: string;
|
|
20
|
+
enabled: boolean;
|
|
21
|
+
home?: string;
|
|
22
|
+
description?: string | null;
|
|
23
|
+
on_success_actions?: SftpAction[] | null;
|
|
24
|
+
on_failure_actions?: SftpAction[] | null;
|
|
25
|
+
quota_used_bytes?: number | null;
|
|
26
|
+
quota_limit_gb?: number | string | null;
|
|
27
|
+
last_quota_calculated_at?: string | null;
|
|
28
|
+
upload_monitoring_enabled?: boolean;
|
|
29
|
+
expected_schedule?: string | null;
|
|
30
|
+
expected_next_upload_at?: string | null;
|
|
31
|
+
last_upload_at?: string | null;
|
|
32
|
+
missed_upload_count?: number;
|
|
33
|
+
alert_on_missed_uploads?: boolean;
|
|
34
|
+
inserted_at?: string;
|
|
35
|
+
updated_at?: string;
|
|
36
|
+
[key: string]: unknown;
|
|
37
|
+
}
|
|
38
|
+
export interface SftpQuota {
|
|
39
|
+
quota_used_bytes?: number | null;
|
|
40
|
+
quota_limit_gb?: number | string | null;
|
|
41
|
+
quota_percentage?: number | null;
|
|
42
|
+
over_quota?: boolean;
|
|
43
|
+
last_calculated_at?: string | null;
|
|
44
|
+
}
|
|
45
|
+
export interface SftpStorageStatus {
|
|
46
|
+
total_used_bytes?: number;
|
|
47
|
+
total_limit_gb?: number | string | null;
|
|
48
|
+
account_count?: number;
|
|
49
|
+
accounts_over_quota?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface SftpRun {
|
|
52
|
+
id: number;
|
|
53
|
+
action_account_id?: number;
|
|
54
|
+
username?: string;
|
|
55
|
+
status?: string;
|
|
56
|
+
type?: string;
|
|
57
|
+
event?: string;
|
|
58
|
+
file?: string | null;
|
|
59
|
+
result?: unknown;
|
|
60
|
+
inserted_at?: string;
|
|
61
|
+
updated_at?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface SftpActivity {
|
|
64
|
+
id: number;
|
|
65
|
+
action?: string;
|
|
66
|
+
status?: string;
|
|
67
|
+
actor_ip?: string | null;
|
|
68
|
+
target_type?: string | null;
|
|
69
|
+
target_id?: string | null;
|
|
70
|
+
error_message?: string | null;
|
|
71
|
+
metadata?: Record<string, unknown> | null;
|
|
72
|
+
inserted_at?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface SftpFileEntry {
|
|
75
|
+
name: string;
|
|
76
|
+
path: string;
|
|
77
|
+
type: 'file' | 'directory' | string;
|
|
78
|
+
size?: number | null;
|
|
79
|
+
modified_at?: string | null;
|
|
80
|
+
}
|
|
81
|
+
export interface SftpMonitoringConfig {
|
|
82
|
+
enabled?: boolean;
|
|
83
|
+
schedule?: {
|
|
84
|
+
type?: string;
|
|
85
|
+
hour?: number | null;
|
|
86
|
+
minute?: number | null;
|
|
87
|
+
day_of_week?: number | null;
|
|
88
|
+
day_of_month?: number | null;
|
|
89
|
+
weekdays_only?: boolean;
|
|
90
|
+
};
|
|
91
|
+
config?: {
|
|
92
|
+
alert_on_missed_uploads?: boolean;
|
|
93
|
+
tolerance_minutes?: number;
|
|
94
|
+
alert_threshold?: number;
|
|
95
|
+
alert_config?: Record<string, unknown>;
|
|
96
|
+
};
|
|
97
|
+
expected_next_upload_at?: string | null;
|
|
98
|
+
last_upload_at?: string | null;
|
|
99
|
+
missed_upload_count?: number;
|
|
100
|
+
}
|
|
101
|
+
export interface SftpMonitoredAccount {
|
|
102
|
+
id: number;
|
|
103
|
+
org_id?: number;
|
|
104
|
+
username: string;
|
|
105
|
+
enabled?: boolean;
|
|
106
|
+
monitoring?: SftpMonitoringConfig;
|
|
107
|
+
}
|
|
108
|
+
export interface SftpContact {
|
|
109
|
+
id: number;
|
|
110
|
+
name?: string;
|
|
111
|
+
email?: string;
|
|
112
|
+
phone?: string;
|
|
113
|
+
[key: string]: unknown;
|
|
114
|
+
}
|
|
115
|
+
export interface SftpReportSchedule {
|
|
116
|
+
id: number;
|
|
117
|
+
enabled?: boolean;
|
|
118
|
+
schedule_type?: string;
|
|
119
|
+
next_run_at?: string | null;
|
|
120
|
+
last_run_at?: string | null;
|
|
121
|
+
last_run_status?: string | null;
|
|
122
|
+
last_run_error?: string | null;
|
|
123
|
+
failure_count?: number;
|
|
124
|
+
[key: string]: unknown;
|
|
125
|
+
}
|
|
126
|
+
/** Assert the installed release exposes an operation, with a release-aware error. */
|
|
127
|
+
export declare function requireOperation(spec: OpenApiDocument, ref: string): ResolvedOperation;
|
|
128
|
+
export declare function supportsOperation(spec: OpenApiDocument, ref: string): boolean;
|
|
129
|
+
export declare const ACCOUNT_USERNAME_PATTERN: RegExp;
|
|
130
|
+
export declare function validateUsername(username: string): void;
|
|
131
|
+
export declare function generateSftpPassword(length?: number): string;
|
|
132
|
+
export declare function parseQuotaGb(value: string | undefined): number | null | undefined;
|
|
133
|
+
/**
|
|
134
|
+
* Parse repeated `--on-success` / `--on-failure` values.
|
|
135
|
+
* Accepts a bare action type, an inline JSON object, or `@file` containing a
|
|
136
|
+
* JSON object or array of objects.
|
|
137
|
+
*/
|
|
138
|
+
export declare function parseActionOptions(values: string[] | undefined): SftpAction[] | undefined;
|
|
139
|
+
export interface CreateAccountInput {
|
|
140
|
+
username: string;
|
|
141
|
+
password?: string;
|
|
142
|
+
generatePassword?: boolean;
|
|
143
|
+
description?: string;
|
|
144
|
+
enabled?: boolean;
|
|
145
|
+
quotaGb?: string;
|
|
146
|
+
callmanagerId?: string;
|
|
147
|
+
onSuccess: string[];
|
|
148
|
+
onFailure: string[];
|
|
149
|
+
}
|
|
150
|
+
export interface AccountPayloadResult {
|
|
151
|
+
account: Record<string, unknown>;
|
|
152
|
+
generatedPassword?: string;
|
|
153
|
+
}
|
|
154
|
+
export declare function buildCreateAccountPayload(input: CreateAccountInput): AccountPayloadResult;
|
|
155
|
+
export interface UpdateAccountInput {
|
|
156
|
+
description?: string;
|
|
157
|
+
quotaGb?: string;
|
|
158
|
+
callmanagerId?: string;
|
|
159
|
+
enable?: boolean;
|
|
160
|
+
disable?: boolean;
|
|
161
|
+
password?: string;
|
|
162
|
+
generatePassword?: boolean;
|
|
163
|
+
onSuccess: string[];
|
|
164
|
+
onFailure: string[];
|
|
165
|
+
clearSuccess?: boolean;
|
|
166
|
+
clearFailure?: boolean;
|
|
167
|
+
}
|
|
168
|
+
export declare function buildUpdateAccountPayload(input: UpdateAccountInput): AccountPayloadResult;
|
|
169
|
+
export declare function listAccounts(api: ApplianceApi): Promise<SftpAccount[]>;
|
|
170
|
+
export declare function resolveAccount(api: ApplianceApi, ref: string): Promise<SftpAccount>;
|
|
171
|
+
export declare function getAccountQuota(api: ApplianceApi, account: SftpAccount): Promise<SftpQuota>;
|
|
172
|
+
export declare function getAccountRuns(api: ApplianceApi, account: SftpAccount, limit?: number, offset?: number): Promise<SftpRun[]>;
|
|
173
|
+
export declare function getAccountActivity(api: ApplianceApi, account: SftpAccount, limit?: number, offset?: number): Promise<SftpActivity[]>;
|
|
174
|
+
export declare function getAccountFiles(api: ApplianceApi, account: SftpAccount, path?: string, limit?: number): Promise<{
|
|
175
|
+
path?: string;
|
|
176
|
+
total?: number;
|
|
177
|
+
entries: SftpFileEntry[];
|
|
178
|
+
}>;
|
|
179
|
+
export declare function getAccountContacts(api: ApplianceApi, account: SftpAccount): Promise<SftpContact[]>;
|
|
180
|
+
export declare function addAccountContacts(api: ApplianceApi, account: SftpAccount, contactIds: number[]): Promise<unknown>;
|
|
181
|
+
export declare function removeAccountContact(api: ApplianceApi, account: SftpAccount, contactId: number): Promise<unknown>;
|
|
182
|
+
export interface MonitoringInput {
|
|
183
|
+
schedule?: string;
|
|
184
|
+
hour?: string;
|
|
185
|
+
minute?: string;
|
|
186
|
+
dayOfWeek?: string;
|
|
187
|
+
dayOfMonth?: string;
|
|
188
|
+
weekdaysOnly?: boolean;
|
|
189
|
+
tolerance?: string;
|
|
190
|
+
threshold?: string;
|
|
191
|
+
alertOnMissed?: boolean;
|
|
192
|
+
alertConfig?: string;
|
|
193
|
+
}
|
|
194
|
+
export declare function buildMonitoringPayload(input: MonitoringInput, requireSchedule: boolean): Record<string, unknown>;
|
|
195
|
+
export declare function listMonitoredAccounts(api: ApplianceApi): Promise<SftpMonitoredAccount[]>;
|
|
196
|
+
export declare function getAccountMonitoring(api: ApplianceApi, account: SftpAccount): Promise<SftpMonitoringConfig>;
|
|
197
|
+
export interface DiscoverMonitoringInput {
|
|
198
|
+
host?: string;
|
|
199
|
+
username?: string;
|
|
200
|
+
password?: string;
|
|
201
|
+
scheduleName?: string;
|
|
202
|
+
callmanagerId?: string;
|
|
203
|
+
tolerance?: string;
|
|
204
|
+
}
|
|
205
|
+
export declare function buildDiscoverPayload(input: DiscoverMonitoringInput): Record<string, unknown>;
|
|
206
|
+
export interface SftpStatusSnapshot {
|
|
207
|
+
accounts: {
|
|
208
|
+
total: number;
|
|
209
|
+
enabled: number;
|
|
210
|
+
disabled: number;
|
|
211
|
+
};
|
|
212
|
+
storage: SftpStorageStatus | null;
|
|
213
|
+
monitoring: {
|
|
214
|
+
available: boolean;
|
|
215
|
+
monitoredCount: number;
|
|
216
|
+
missingUploads: number | null;
|
|
217
|
+
};
|
|
218
|
+
operations: {
|
|
219
|
+
total: number;
|
|
220
|
+
specOpenApi: string | null;
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
export declare function collectSftpStatus(api: ApplianceApi, spec: OpenApiDocument): Promise<SftpStatusSnapshot>;
|
|
224
|
+
/** Read a CSV or JSON file for import. */
|
|
225
|
+
export declare function readImportFile(path: string): {
|
|
226
|
+
filename: string;
|
|
227
|
+
data: Buffer;
|
|
228
|
+
contentType: string;
|
|
229
|
+
};
|
|
230
|
+
export declare function parseContactIds(values: string[] | undefined): number[];
|
|
231
|
+
//# sourceMappingURL=sftp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sftp.d.ts","sourceRoot":"","sources":["../../src/lib/sftp.ts"],"names":[],"mappings":"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"}
|