node-autotask 0.40.0 → 0.42.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/CHANGELOG.md +32 -0
- package/MCP_TOOL_CATALOG.json +147 -149
- package/MCP_TOOL_MANIFEST.md +9 -9
- package/N8N_MCP_MANIFEST.json +4 -43
- package/N8N_MCP_MANIFEST.md +6 -7
- package/README.md +3 -4
- package/capabilities.json +3945 -3405
- package/dist/capabilities.cjs +2 -2
- package/dist/capabilities.js +1 -1
- package/dist/{chunk-VDVBXXJW.js → chunk-AETFO6BO.js} +1765 -1880
- package/dist/{chunk-EUGSF3U4.cjs → chunk-HD5BRA3Z.cjs} +285 -285
- package/dist/{chunk-E5W24BZB.cjs → chunk-MYL34QU5.cjs} +143 -143
- package/dist/{chunk-FEYVLIHD.cjs → chunk-SEFJJY4J.cjs} +2801 -2916
- package/dist/{chunk-O32L6GS5.js → chunk-TTPHVFPJ.js} +2 -2
- package/dist/{chunk-EVDVESQM.cjs → chunk-VEOSOIU4.cjs} +3944 -3404
- package/dist/{chunk-Y6YJYKBZ.js → chunk-WP33PQVM.js} +3944 -3404
- package/dist/{chunk-MTFRSD7P.js → chunk-ZR24JGW2.js} +2 -2
- package/dist/index-C3KFMnRT.d.cts +6860 -0
- package/dist/index-C3KFMnRT.d.ts +6860 -0
- package/dist/{index-BKp8_P2L.d.cts → index-C7rMJ4IV.d.ts} +139 -7236
- package/dist/{index-BKp8_P2L.d.ts → index-Cm_Xpt7X.d.cts} +139 -7236
- package/dist/index.cjs +22 -24
- package/dist/index.d.cts +58 -34
- package/dist/index.d.ts +58 -34
- package/dist/index.js +8 -10
- package/dist/operations/index.cjs +363 -242
- package/dist/operations/index.d.cts +281 -25
- package/dist/operations/index.d.ts +281 -25
- package/dist/operations/index.js +178 -57
- package/dist/pool.cjs +8 -8
- package/dist/pool.d.cts +2 -1
- package/dist/pool.d.ts +2 -1
- package/dist/pool.js +4 -4
- package/dist/resources/index.cjs +4 -4
- package/dist/resources/index.d.cts +2 -1
- package/dist/resources/index.d.ts +2 -1
- package/dist/resources/index.js +3 -3
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/docs/API.md +101 -139
- package/docs/LIVE-TESTING.md +9 -5
- package/docs/N8N-ADAPTER.md +1 -1
- package/docs/RELEASING.md +121 -0
- package/package.json +3 -2
package/dist/operations/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
AutotaskConfigError,
|
|
3
3
|
AutotaskError,
|
|
4
4
|
BLIND_SURFACE_INVENTORY,
|
|
5
|
+
BOUNDED_QUERY_DEFAULT_LIMIT,
|
|
5
6
|
BOUNDED_QUERY_MAX_LIMIT,
|
|
6
7
|
BillingCodesResource,
|
|
7
8
|
BillingItemsResource,
|
|
@@ -12,7 +13,6 @@ import {
|
|
|
12
13
|
ContractsResource,
|
|
13
14
|
DELETE_BOUNDARY_NOTES,
|
|
14
15
|
DeleteBoundaryError,
|
|
15
|
-
ENTITY_TYPE_TO_RESOURCE,
|
|
16
16
|
EXPAND_RESOURCE_NAMES_MAX_IDS,
|
|
17
17
|
FETCH_BY_IDS_CHUNK_SIZE,
|
|
18
18
|
FETCH_BY_IDS_MAX_ITEMS,
|
|
@@ -29,7 +29,6 @@ import {
|
|
|
29
29
|
OrganizationalLevel1sResource,
|
|
30
30
|
OrganizationalLevel2sResource,
|
|
31
31
|
OrganizationalLevelAssociationsResource,
|
|
32
|
-
PICKLIST_CATALOG_UNAVAILABLE_NOTE,
|
|
33
32
|
PICKLIST_VALUE_NOT_SERVED_NOTE,
|
|
34
33
|
PROFITABILITY_MAX_WINDOW_MONTHS,
|
|
35
34
|
REACHABILITY_PROBE_DEFAULTS,
|
|
@@ -38,8 +37,10 @@ import {
|
|
|
38
37
|
RecoveryTruncatedError,
|
|
39
38
|
ResourcesResource,
|
|
40
39
|
SERVICE_LINE_FKS,
|
|
40
|
+
ScopeRequiredError,
|
|
41
41
|
TimeEntriesResource,
|
|
42
42
|
UI_LINK_ENTITIES,
|
|
43
|
+
UNSCOPED_WALK_THRESHOLD,
|
|
43
44
|
WORKFLOW_RESOURCES,
|
|
44
45
|
billingLineType,
|
|
45
46
|
buildFilter,
|
|
@@ -57,23 +58,25 @@ import {
|
|
|
57
58
|
internalAmount,
|
|
58
59
|
isAutotaskError,
|
|
59
60
|
isDateYMD,
|
|
60
|
-
isEnumerableResource,
|
|
61
61
|
isRecord,
|
|
62
62
|
labelRows,
|
|
63
63
|
monthsInWindow,
|
|
64
|
+
normalizedConditions,
|
|
64
65
|
num,
|
|
65
66
|
parseIdentifier,
|
|
66
67
|
readNamesOpt,
|
|
67
68
|
readPicklists,
|
|
68
|
-
resourceForEntityType,
|
|
69
69
|
uiLink,
|
|
70
70
|
validateFetchManyItems,
|
|
71
|
-
validateQueryFieldNames
|
|
72
|
-
|
|
71
|
+
validateQueryFieldNames,
|
|
72
|
+
validateWalkBag
|
|
73
|
+
} from "../chunk-AETFO6BO.js";
|
|
73
74
|
import {
|
|
74
75
|
CAPABILITIES
|
|
75
|
-
} from "../chunk-
|
|
76
|
-
import
|
|
76
|
+
} from "../chunk-WP33PQVM.js";
|
|
77
|
+
import {
|
|
78
|
+
deepMarkUntrusted
|
|
79
|
+
} from "../chunk-5VHSLJMR.js";
|
|
77
80
|
|
|
78
81
|
// src/operations/searchAcrossResources.ts
|
|
79
82
|
var DEFAULT_LIMIT = 25;
|
|
@@ -140,6 +143,10 @@ async function resolveAny(client, identifier, opts = {}) {
|
|
|
140
143
|
if (keys.length === 0) {
|
|
141
144
|
throw new AutotaskConfigError("resolveAny: no resources requested");
|
|
142
145
|
}
|
|
146
|
+
const match = opts.match ?? "exact";
|
|
147
|
+
if (match !== "exact" && match !== "auto") {
|
|
148
|
+
throw new AutotaskConfigError(`resolveAny: match must be 'exact' or 'auto' (got ${JSON.stringify(match)})`);
|
|
149
|
+
}
|
|
143
150
|
const results = [];
|
|
144
151
|
for (const key of keys) {
|
|
145
152
|
const holder = resourceFor2(client, key);
|
|
@@ -157,14 +164,31 @@ async function resolveAny(client, identifier, opts = {}) {
|
|
|
157
164
|
}
|
|
158
165
|
try {
|
|
159
166
|
const r = await holder.resolveDetailed(identifier);
|
|
160
|
-
|
|
167
|
+
let outcome = {
|
|
161
168
|
resource: key,
|
|
162
169
|
value: r.value ?? null,
|
|
163
170
|
resolutionCost: r.resolutionCost,
|
|
164
171
|
scanned: r.scanned,
|
|
165
172
|
scanTruncated: r.scanTruncated,
|
|
166
173
|
candidates: (r.candidates ?? []).map((c) => c.id)
|
|
167
|
-
}
|
|
174
|
+
};
|
|
175
|
+
if (match === "auto" && outcome.value === null && typeof identifier === "string") {
|
|
176
|
+
const hits = await holder.resolveContainsMatches(identifier);
|
|
177
|
+
if (hits.length === 1) {
|
|
178
|
+
outcome = { resource: key, value: hits[0], resolutionCost: "server-filter", scanned: 0, scanTruncated: false, candidates: [] };
|
|
179
|
+
} else if (hits.length > 1) {
|
|
180
|
+
outcome = {
|
|
181
|
+
resource: key,
|
|
182
|
+
value: null,
|
|
183
|
+
resolutionCost: "server-filter",
|
|
184
|
+
scanned: 0,
|
|
185
|
+
scanTruncated: false,
|
|
186
|
+
candidates: hits.map((h) => h.id).filter((id) => typeof id === "number"),
|
|
187
|
+
error: "RESOLUTION_AMBIGUOUS"
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
results.push(outcome);
|
|
168
192
|
} catch (err) {
|
|
169
193
|
let code;
|
|
170
194
|
let candidates = [];
|
|
@@ -257,7 +281,7 @@ var QUERY_RESOURCE_KEYS = (() => {
|
|
|
257
281
|
for (const rec of CAPABILITIES) if (rec.operation === "query") s.add(rec.resource);
|
|
258
282
|
return s;
|
|
259
283
|
})();
|
|
260
|
-
var AGGREGATE_OPT_KEYS = ["groupBy", "sum", "top", "limit", "names"];
|
|
284
|
+
var AGGREGATE_OPT_KEYS = ["groupBy", "sum", "top", "limit", "names", "acknowledgeUnscoped"];
|
|
261
285
|
var OP_RE = /^([a-z0-9_]+)\.query$/;
|
|
262
286
|
function num2(v) {
|
|
263
287
|
return typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
@@ -309,6 +333,9 @@ function checkOptsBag(opts, problems) {
|
|
|
309
333
|
}
|
|
310
334
|
}
|
|
311
335
|
if (opts?.names !== void 0 && typeof opts.names !== "boolean") problems.push(`names must be a boolean (got ${typeof opts.names})`);
|
|
336
|
+
if (opts?.acknowledgeUnscoped !== void 0 && typeof opts.acknowledgeUnscoped !== "boolean") {
|
|
337
|
+
problems.push(`acknowledgeUnscoped must be a boolean (got ${typeof opts.acknowledgeUnscoped})`);
|
|
338
|
+
}
|
|
312
339
|
}
|
|
313
340
|
function checkSumFields(name, fields, problems) {
|
|
314
341
|
if (fields === void 0) return [];
|
|
@@ -373,7 +400,7 @@ async function checkFieldNames(resourceKey, conditions, opts, problems) {
|
|
|
373
400
|
const strings = (v) => Array.isArray(v) ? v.filter((f) => typeof f === "string" && f.trim() !== "") : [];
|
|
374
401
|
const groupBy = strings(opts.groupBy);
|
|
375
402
|
const found = await findUnknownFieldNames(record, void 0, {
|
|
376
|
-
filter: collectFilterFieldNames(conditions),
|
|
403
|
+
filter: collectFilterFieldNames(conditions, resourceKey),
|
|
377
404
|
groupBy: groupBy.map((f) => f.split("@")[0]),
|
|
378
405
|
sum: strings(opts.sum)
|
|
379
406
|
});
|
|
@@ -410,6 +437,9 @@ async function validateAggregate(operation, filter, opts) {
|
|
|
410
437
|
{ operation: "operations.aggregate" }
|
|
411
438
|
);
|
|
412
439
|
}
|
|
440
|
+
if ((groupBy.length > 0 || sum.length > 0) && conditions.length === 0 && opts.acknowledgeUnscoped !== true) {
|
|
441
|
+
throw new ScopeRequiredError(operation, { threshold: UNSCOPED_WALK_THRESHOLD }, "empty-filter");
|
|
442
|
+
}
|
|
413
443
|
return { resourceKey, conditions, groupBy, sum, top, limit };
|
|
414
444
|
}
|
|
415
445
|
function foldGroups(items, v) {
|
|
@@ -449,7 +479,7 @@ async function aggregate(client, operation, filter, opts = {}) {
|
|
|
449
479
|
if (v.groupBy.length === 0 && v.sum.length === 0) {
|
|
450
480
|
const raw = await holder.count({ filter: wireFilter });
|
|
451
481
|
const sentinel = typeof raw === "object" && raw !== null && "count" in raw ? raw : { count: raw };
|
|
452
|
-
const result2 = { mode: "count", count: sentinel.count, blind: sentinel.blindSurface !== void 0 };
|
|
482
|
+
const result2 = { mode: "count", count: sentinel.count, blind: sentinel.blindSurface !== void 0, truncated: false };
|
|
453
483
|
if (sentinel.blindSurface !== void 0) result2.blindSurface = sentinel.blindSurface;
|
|
454
484
|
if (sentinel.emptyReason !== void 0) result2.emptyReason = sentinel.emptyReason;
|
|
455
485
|
return result2;
|
|
@@ -457,14 +487,17 @@ async function aggregate(client, operation, filter, opts = {}) {
|
|
|
457
487
|
const res = await holder.queryBounded({ filter: wireFilter, limit: v.limit });
|
|
458
488
|
const sorted = foldGroups(res.items, v);
|
|
459
489
|
const top = sorted.slice(0, v.top);
|
|
460
|
-
const
|
|
490
|
+
const label = readNamesOpt(client, opts.names, "aggregate");
|
|
491
|
+
const labelled = !label || v.groupBy.length === 0 ? void 0 : await labelRows(client, v.resourceKey, top.map((g) => g.key));
|
|
461
492
|
const result = {
|
|
462
493
|
mode: v.groupBy.length > 0 ? "group" : "sum",
|
|
463
494
|
groups: top.map((g, i) => ({ key: labelled?.rows[i] ?? g.key, count: g.count, ...g.sums !== void 0 ? { sums: g.sums } : {} })),
|
|
464
495
|
totalGroups: sorted.length,
|
|
465
496
|
groupsTruncated: sorted.length > top.length,
|
|
466
497
|
totalScanned: res.fetched,
|
|
467
|
-
hasMore: res.hasMore
|
|
498
|
+
hasMore: res.hasMore,
|
|
499
|
+
truncated: res.hasMore
|
|
500
|
+
// issue #287 (D6): the walk hit its limit — groups may be incomplete
|
|
468
501
|
};
|
|
469
502
|
if (res.blindSurface !== void 0) result.blindSurface = res.blindSurface;
|
|
470
503
|
if (res.emptyReason !== void 0) result.emptyReason = res.emptyReason;
|
|
@@ -1384,6 +1417,30 @@ async function createGuidance(client, opts) {
|
|
|
1384
1417
|
};
|
|
1385
1418
|
}
|
|
1386
1419
|
|
|
1420
|
+
// src/operations/registryIndex.ts
|
|
1421
|
+
var OPERATION_BY_ID = new Map(CAPABILITIES.map((r) => [r.id, r]));
|
|
1422
|
+
|
|
1423
|
+
// src/operations/sanitiseResult.ts
|
|
1424
|
+
async function sanitiseResult(client, result, operation) {
|
|
1425
|
+
void client;
|
|
1426
|
+
if (typeof operation !== "string" || operation === "") {
|
|
1427
|
+
throw new AutotaskConfigError(
|
|
1428
|
+
'sanitiseResult: operation must be a non-empty registry operation key (e.g. "tickets.query")',
|
|
1429
|
+
{ suggestedAction: "Pass the operation key the result came from \u2014 the registry id, not the resource key." }
|
|
1430
|
+
);
|
|
1431
|
+
}
|
|
1432
|
+
const record = OPERATION_BY_ID.get(operation);
|
|
1433
|
+
if (record === void 0) {
|
|
1434
|
+
throw new AutotaskConfigError(
|
|
1435
|
+
`sanitiseResult: unknown operation "${operation.slice(0, 60)}" \u2014 it is not in the capability registry`,
|
|
1436
|
+
{ operation, suggestedAction: "List the registry (the ./capabilities subpath) for the exact operation key." }
|
|
1437
|
+
);
|
|
1438
|
+
}
|
|
1439
|
+
const fields = record.metadata?.untrustedFields;
|
|
1440
|
+
if (!Array.isArray(fields) || fields.length === 0) return result;
|
|
1441
|
+
return deepMarkUntrusted(result, fields);
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1387
1444
|
// src/operations/recovery.ts
|
|
1388
1445
|
var RECOVERY_CONFIRM = "operations.recovery";
|
|
1389
1446
|
var RECOVERY_DEFAULT_LIMIT = 25;
|
|
@@ -1812,7 +1869,7 @@ function foldFlattenedOpts(record, toolArgs) {
|
|
|
1812
1869
|
|
|
1813
1870
|
// src/operations/invoke/inputSets.ts
|
|
1814
1871
|
var PARAMS_BAG_KEYS = {
|
|
1815
|
-
query: ["filter", "limit", "includeFields", "via", "latest", "noteChars", "
|
|
1872
|
+
query: ["filter", "limit", "includeFields", "via", "latest", "noteChars", "fieldCheck", "names", "acknowledgeUnscoped", "walk"],
|
|
1816
1873
|
// No registry row DECLARES `queryAll` today (a plan decision: the raw walk is
|
|
1817
1874
|
// called directly), so this entry never fires. It is KEPT so that a future
|
|
1818
1875
|
// `queryAll` row — which `invoke` WOULD dispatch via holder[operation] —
|
|
@@ -1832,7 +1889,9 @@ var BAG_KEY_SYNONYMS = {
|
|
|
1832
1889
|
page: "limit",
|
|
1833
1890
|
pageSize: "limit",
|
|
1834
1891
|
cursor: "limit",
|
|
1835
|
-
maxrecords: "maxRecords"
|
|
1892
|
+
maxrecords: "maxRecords",
|
|
1893
|
+
fieldsPreset: "includeFields"
|
|
1894
|
+
// issue #287: the preset was removed — the refusal points at the explicit includeFields
|
|
1836
1895
|
};
|
|
1837
1896
|
function levenshtein(a, b) {
|
|
1838
1897
|
if (a === b) return 0;
|
|
@@ -1859,6 +1918,9 @@ function suggestForKey(key, valid) {
|
|
|
1859
1918
|
if (best !== null && best.dist <= 3) return best.key;
|
|
1860
1919
|
return null;
|
|
1861
1920
|
}
|
|
1921
|
+
function keySuggestions(unknown, valid) {
|
|
1922
|
+
return unknown.map((k) => [k, suggestForKey(k, valid)]).filter((pair) => pair[1] !== null).map(([k, s]) => `"${k}" \u2192 "${s}"`);
|
|
1923
|
+
}
|
|
1862
1924
|
function validateParamsBag(record, args) {
|
|
1863
1925
|
if (record.inputSchemaStrict !== true) return;
|
|
1864
1926
|
const valid = PARAMS_BAG_KEYS[record.operation];
|
|
@@ -1867,7 +1929,7 @@ function validateParamsBag(record, args) {
|
|
|
1867
1929
|
if (bag === void 0 || bag === null || !isRecord(bag)) return;
|
|
1868
1930
|
const unknown = Object.keys(bag).filter((k) => !valid.includes(k));
|
|
1869
1931
|
if (unknown.length === 0) return;
|
|
1870
|
-
const suggestions = unknown
|
|
1932
|
+
const suggestions = keySuggestions(unknown, valid);
|
|
1871
1933
|
throw new AutotaskConfigError(
|
|
1872
1934
|
`invoke: "${record.id}" params bag has unknown key(s) ${unknown.map((k) => `"${k}"`).join(", ")} \u2014 the bag is closed (valid keys: ${valid.join(", ")})`,
|
|
1873
1935
|
{
|
|
@@ -1876,31 +1938,12 @@ function validateParamsBag(record, args) {
|
|
|
1876
1938
|
}
|
|
1877
1939
|
);
|
|
1878
1940
|
}
|
|
1879
|
-
function validateGetBag(record, args) {
|
|
1880
|
-
if (record.kind !== "primitive" || record.operation !== "get") return;
|
|
1881
|
-
const at = Object.keys(record.inputSchema ?? {}).indexOf("opts");
|
|
1882
|
-
const bag = at < 0 ? void 0 : args?.[at];
|
|
1883
|
-
if (bag === void 0 || bag === null || !isRecord(bag)) return;
|
|
1884
|
-
const unknown = Object.keys(bag).filter((k) => k !== "fresh");
|
|
1885
|
-
if (unknown.length > 0) {
|
|
1886
|
-
throw new AutotaskConfigError(
|
|
1887
|
-
`invoke: "${record.id}" opts bag has unknown key(s) ${unknown.map((k) => `"${k}"`).join(", ")} \u2014 the bag is closed (valid keys: fresh)`,
|
|
1888
|
-
{ operation: record.id, suggestedAction: "Pass only { fresh?: boolean }." }
|
|
1889
|
-
);
|
|
1890
|
-
}
|
|
1891
|
-
if (bag.fresh !== void 0 && typeof bag.fresh !== "boolean") {
|
|
1892
|
-
throw new AutotaskConfigError(
|
|
1893
|
-
`invoke: fresh must be a boolean (got ${typeof bag.fresh}) \u2014 "${record.id}" was not issued`,
|
|
1894
|
-
{ operation: record.id, suggestedAction: "Pass fresh: true (bypass the read cache) or omit it." }
|
|
1895
|
-
);
|
|
1896
|
-
}
|
|
1897
|
-
}
|
|
1898
1941
|
var INVOKE_OPTION_KEYS = ["dryRun", "confirm", "lastModifiedDate", "maxRetries", "fresh", "mode"];
|
|
1899
1942
|
function validateInvokeOptions(opts, operation) {
|
|
1900
1943
|
if (opts === void 0 || opts === null) return;
|
|
1901
1944
|
const unknown = Object.keys(opts).filter((k) => !INVOKE_OPTION_KEYS.includes(k));
|
|
1902
1945
|
if (unknown.length === 0) return;
|
|
1903
|
-
const suggestions = unknown
|
|
1946
|
+
const suggestions = keySuggestions(unknown, ["dryRun", "confirm", "lastModifiedDate", "maxRetries", "fresh"]);
|
|
1904
1947
|
throw new AutotaskConfigError(
|
|
1905
1948
|
`invoke: "${operation}" has unknown option key(s) ${unknown.map((k) => `"${k}"`).join(", ")} \u2014 the options set is closed (valid: dryRun, confirm, lastModifiedDate, maxRetries, fresh; "mode" is internal to the mode wrappers)`,
|
|
1906
1949
|
{
|
|
@@ -1913,7 +1956,7 @@ function unknownKeysRefusal(raw, validKeys, subject, operation) {
|
|
|
1913
1956
|
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
|
|
1914
1957
|
const unknown = Object.keys(raw).filter((k) => !validKeys.includes(k));
|
|
1915
1958
|
if (unknown.length === 0) return null;
|
|
1916
|
-
const suggestions = unknown
|
|
1959
|
+
const suggestions = keySuggestions(unknown, [...validKeys]);
|
|
1917
1960
|
return new AutotaskConfigError(
|
|
1918
1961
|
`unknown ${subject} ${unknown.map((k) => `"${k}"`).join(", ")} \u2014 the ${subject} set is closed (valid keys: ${validKeys.join(", ")})`,
|
|
1919
1962
|
{
|
|
@@ -1923,9 +1966,63 @@ function unknownKeysRefusal(raw, validKeys, subject, operation) {
|
|
|
1923
1966
|
);
|
|
1924
1967
|
}
|
|
1925
1968
|
|
|
1926
|
-
// src/operations/
|
|
1927
|
-
var
|
|
1928
|
-
|
|
1969
|
+
// src/operations/scopeGuard.ts
|
|
1970
|
+
var PROPAGATE_CODES = /* @__PURE__ */ new Set([
|
|
1971
|
+
"ABORTED",
|
|
1972
|
+
"UNAUTHORIZED",
|
|
1973
|
+
"FORBIDDEN",
|
|
1974
|
+
"HOST_POLICY_DENIED",
|
|
1975
|
+
"RATE_LIMITED",
|
|
1976
|
+
"RATE_LIMITED_COOLDOWN"
|
|
1977
|
+
]);
|
|
1978
|
+
function hasIdScope(filter) {
|
|
1979
|
+
if (Array.isArray(filter)) return filter.some(hasIdScope);
|
|
1980
|
+
if (filter === null || typeof filter !== "object") return false;
|
|
1981
|
+
const n = filter;
|
|
1982
|
+
const op = typeof n.op === "string" ? n.op.toLowerCase() : "";
|
|
1983
|
+
if (Array.isArray(n.items)) return op === "and" && n.items.some(hasIdScope);
|
|
1984
|
+
if (Array.isArray(n.filter)) return hasIdScope(n.filter);
|
|
1985
|
+
if (typeof n.field !== "string" || !(n.field === "id" || /ID$/.test(n.field))) return false;
|
|
1986
|
+
const real = (v) => v !== void 0 && v !== null && v !== "";
|
|
1987
|
+
const list = Array.isArray(n.value) ? n.value : typeof n.value === "string" ? n.value.split(",").map((t) => t.trim()) : [];
|
|
1988
|
+
return op === "eq" && real(n.value) || op === "in" && list.some(real);
|
|
1989
|
+
}
|
|
1990
|
+
async function guardUnscopedQueryWalk(holder, operation, bag) {
|
|
1991
|
+
const filter = bag?.["filter"];
|
|
1992
|
+
const limit = bag?.["limit"];
|
|
1993
|
+
const latest = bag?.["latest"];
|
|
1994
|
+
const walk = typeof bag?.["walk"] === "object" && bag?.["walk"] !== null ? bag?.["walk"] : void 0;
|
|
1995
|
+
const maxRows = typeof walk?.maxRows === "number" ? walk.maxRows : void 0;
|
|
1996
|
+
const effectiveLimit = typeof limit === "number" ? limit : BOUNDED_QUERY_DEFAULT_LIMIT;
|
|
1997
|
+
let walked = typeof latest === "number" ? Math.max(effectiveLimit, latest) : effectiveLimit;
|
|
1998
|
+
if (maxRows !== void 0) walked = Math.min(walked, maxRows);
|
|
1999
|
+
if (walked <= UNSCOPED_WALK_THRESHOLD || hasIdScope(filter)) return {};
|
|
2000
|
+
let conditions;
|
|
2001
|
+
try {
|
|
2002
|
+
conditions = normalizedConditions(filter);
|
|
2003
|
+
} catch {
|
|
2004
|
+
return {};
|
|
2005
|
+
}
|
|
2006
|
+
let counted;
|
|
2007
|
+
try {
|
|
2008
|
+
counted = await holder.count({ filter: conditions === void 0 ? void 0 : conditions });
|
|
2009
|
+
} catch (err) {
|
|
2010
|
+
const code = err?.code;
|
|
2011
|
+
if (typeof code === "string" && PROPAGATE_CODES.has(code)) throw err;
|
|
2012
|
+
const label = typeof code === "string" && /^[A-Z][A-Z_]{2,40}$/.test(code) ? ` (${code})` : "";
|
|
2013
|
+
return { note: `scope check skipped: the pre-flight count failed${label}; this unscoped walk was not guarded.` };
|
|
2014
|
+
}
|
|
2015
|
+
const sentinel = typeof counted === "object" && counted !== null && "count" in counted ? counted : { count: counted };
|
|
2016
|
+
if (sentinel.blindSurface !== void 0) {
|
|
2017
|
+
return { note: "scope check skipped: the count surface is blind (a 0 is not a true zero); this unscoped walk was not guarded." };
|
|
2018
|
+
}
|
|
2019
|
+
const count = typeof sentinel.count === "number" && Number.isFinite(sentinel.count) && sentinel.count >= 0 ? sentinel.count : void 0;
|
|
2020
|
+
if (count === void 0) {
|
|
2021
|
+
return { note: "scope check skipped: the pre-flight count was unreadable; this unscoped walk was not guarded." };
|
|
2022
|
+
}
|
|
2023
|
+
if (count > UNSCOPED_WALK_THRESHOLD) throw new ScopeRequiredError(operation, { threshold: UNSCOPED_WALK_THRESHOLD, count });
|
|
2024
|
+
return {};
|
|
2025
|
+
}
|
|
1929
2026
|
|
|
1930
2027
|
// src/operations/invoke/dispatch.ts
|
|
1931
2028
|
var INVOKE_MAX_INLINE_BYTES = 1024 * 1024;
|
|
@@ -1941,7 +2038,7 @@ function bufferResult(buf) {
|
|
|
1941
2038
|
};
|
|
1942
2039
|
}
|
|
1943
2040
|
function resolveRecord(operation) {
|
|
1944
|
-
const record =
|
|
2041
|
+
const record = OPERATION_BY_ID.get(operation);
|
|
1945
2042
|
if (record === void 0) {
|
|
1946
2043
|
throw new AutotaskConfigError(
|
|
1947
2044
|
`invoke: unknown operation "${operation}" \u2014 it is not in the capability registry`,
|
|
@@ -2022,6 +2119,10 @@ function operationsHolder(client) {
|
|
|
2022
2119
|
createGuidance: (opts) => createGuidance(client, opts),
|
|
2023
2120
|
// Issue #202: ExecuteCommand deep links — pure, zero wire.
|
|
2024
2121
|
uiLink: (input) => uiLink(client, input),
|
|
2122
|
+
// Issue #287 (D8): the projection-layer untrusted-content helper — pure,
|
|
2123
|
+
// zero wire (the registry record's metadata.untrustedFields + the deep
|
|
2124
|
+
// walker from src/untrusted.ts; an unknown operation refuses).
|
|
2125
|
+
sanitiseResult: (result, operation) => sanitiseResult(client, result, operation),
|
|
2025
2126
|
// Issue #31: the opt-in live field-metadata channel — N bounded
|
|
2026
2127
|
// entityInformation GETs (the op's own cap refuses over-cap fan-outs
|
|
2027
2128
|
// pre-request; per-resource failures are recorded on the row and
|
|
@@ -2094,18 +2195,37 @@ function appendFresh(record, callArgs) {
|
|
|
2094
2195
|
callArgs[at] = { fresh: true };
|
|
2095
2196
|
return callArgs;
|
|
2096
2197
|
}
|
|
2198
|
+
function validateFreshSpelling(record, args) {
|
|
2199
|
+
if (record.kind !== "primitive" || record.operation !== "get") return;
|
|
2200
|
+
const at = Object.keys(record.inputSchema ?? {}).indexOf("opts");
|
|
2201
|
+
const bag = at < 0 ? void 0 : args[at];
|
|
2202
|
+
if (bag === void 0 || bag === null) return;
|
|
2203
|
+
throw new AutotaskConfigError(
|
|
2204
|
+
`invoke: "${record.id}" takes no positional options bag \u2014 the fresh spelling is the fresh invoke option (pass { fresh: true } in the invoke options, not as a method argument)`,
|
|
2205
|
+
{
|
|
2206
|
+
operation: record.id,
|
|
2207
|
+
suggestedAction: 'Pass fresh: true as an invoke option: invoke(client, "<resource>.get", [id], { fresh: true }). The typed client.<resource>.get(id, { fresh: true }) method keeps its own bag.'
|
|
2208
|
+
}
|
|
2209
|
+
);
|
|
2210
|
+
}
|
|
2211
|
+
var PRE_REQUEST_VALIDATORS = [
|
|
2212
|
+
(c) => governPreRequest(c.record, c.operation, c.opts),
|
|
2213
|
+
(c) => validateDispatchArgs(c.record, c.args),
|
|
2214
|
+
(c) => validateParamsBag(c.record, c.args),
|
|
2215
|
+
(c) => validateFreshSpelling(c.record, c.args),
|
|
2216
|
+
(c) => c.boundedQuery || c.countedQuery ? validateQueryFieldNames(c.record, c.holder, c.args) : Promise.resolve(void 0)
|
|
2217
|
+
];
|
|
2218
|
+
async function runPreRequestPass(ctx) {
|
|
2219
|
+
for (const step of PRE_REQUEST_VALIDATORS) await step(ctx);
|
|
2220
|
+
}
|
|
2097
2221
|
async function invokeMode(client, operation, argsIn = [], opts = {}) {
|
|
2098
2222
|
const record = resolveRecord(operation);
|
|
2099
|
-
governPreRequest(record, operation, opts);
|
|
2100
2223
|
const args = resolveDispatchArgs(record, argsIn);
|
|
2101
|
-
validateDispatchArgs(record, args);
|
|
2102
|
-
validateParamsBag(record, args);
|
|
2103
|
-
validateGetBag(record, args);
|
|
2104
2224
|
const boundedQuery = record.kind === "primitive" && record.operation === "query";
|
|
2105
2225
|
const countedQuery = record.kind === "primitive" && record.operation === "count";
|
|
2106
2226
|
const holder = resolveHolder(client, record, operation);
|
|
2107
|
-
|
|
2108
|
-
const labelQuery = boundedQuery && readNamesOpt(args[0]?.["names"], `invoke: "${record.id}" params bag`);
|
|
2227
|
+
await runPreRequestPass({ record, operation, args, opts, client, holder, boundedQuery, countedQuery });
|
|
2228
|
+
const labelQuery = boundedQuery && readNamesOpt(client, args[0]?.["names"], `invoke: "${record.id}" params bag`);
|
|
2109
2229
|
const methodName = boundedQuery ? "queryBounded" : record.operation;
|
|
2110
2230
|
const method = holder[methodName];
|
|
2111
2231
|
if (typeof method !== "function") {
|
|
@@ -2118,16 +2238,20 @@ async function invokeMode(client, operation, argsIn = [], opts = {}) {
|
|
|
2118
2238
|
const mutationOpts = buildMutationOpts(opts, isWrite);
|
|
2119
2239
|
const callArgs = buildCallArgs(record, args, mutationOpts, isWrite);
|
|
2120
2240
|
if (opts.fresh === true) appendFresh(record, callArgs);
|
|
2241
|
+
if (boundedQuery) validateWalkBag(args[0]?.["walk"], `invoke: "${record.id}"`, { operation: record.id });
|
|
2242
|
+
let scopeNote;
|
|
2243
|
+
if (boundedQuery && args[0]?.["acknowledgeUnscoped"] !== true) {
|
|
2244
|
+
scopeNote = (await guardUnscopedQueryWalk(holder, record.id, args[0])).note;
|
|
2245
|
+
}
|
|
2121
2246
|
const result = await method.apply(holder, callArgs);
|
|
2122
2247
|
if (labelQuery && Array.isArray(result?.items)) {
|
|
2123
2248
|
const bounded = result;
|
|
2124
2249
|
const labelled = await labelRows(client, record.resource, bounded.items);
|
|
2125
|
-
return { ...bounded, items: labelled.rows, ...labelled.names !== void 0 ? { names: labelled.names } : {} };
|
|
2250
|
+
return { ...bounded, items: labelled.rows, ...labelled.names !== void 0 ? { names: labelled.names } : {}, ...scopeNote !== void 0 ? { scopeNote } : {} };
|
|
2126
2251
|
}
|
|
2127
|
-
|
|
2252
|
+
const finished = Buffer.isBuffer(result) ? bufferResult(result) : result;
|
|
2253
|
+
return scopeNote !== void 0 && finished !== null && typeof finished === "object" ? { ...finished, scopeNote } : finished;
|
|
2128
2254
|
}
|
|
2129
|
-
|
|
2130
|
-
// src/operations/invoke/wrappers.ts
|
|
2131
2255
|
async function invoke(client, operation, args = [], opts = {}) {
|
|
2132
2256
|
return invokeMode(client, operation, args, { ...opts, mode: void 0 });
|
|
2133
2257
|
}
|
|
@@ -2147,7 +2271,6 @@ export {
|
|
|
2147
2271
|
AGGREGATE_TOP_MAX,
|
|
2148
2272
|
BLIND_SURFACE_KINDS,
|
|
2149
2273
|
CREATE_BLOCKER_KINDS,
|
|
2150
|
-
ENTITY_TYPE_TO_RESOURCE,
|
|
2151
2274
|
EXPAND_RESOURCE_NAMES_MAX_IDS,
|
|
2152
2275
|
FETCH_BY_IDS_CHUNK_SIZE,
|
|
2153
2276
|
FETCH_BY_IDS_MAX_ITEMS,
|
|
@@ -2158,7 +2281,6 @@ export {
|
|
|
2158
2281
|
MAX_FIELD_CATALOG_WIRE,
|
|
2159
2282
|
MIN_FIELD_CATALOG_MAX_BYTES,
|
|
2160
2283
|
PARAMS_BAG_KEYS,
|
|
2161
|
-
PICKLIST_CATALOG_UNAVAILABLE_NOTE,
|
|
2162
2284
|
PICKLIST_VALUE_NOT_SERVED_NOTE,
|
|
2163
2285
|
RECOVERY_CONFIRM,
|
|
2164
2286
|
RECOVERY_DEFAULT_LIMIT,
|
|
@@ -2180,14 +2302,13 @@ export {
|
|
|
2180
2302
|
invokeDelete,
|
|
2181
2303
|
invokeRead,
|
|
2182
2304
|
invokeWrite,
|
|
2183
|
-
isEnumerableResource,
|
|
2184
2305
|
needsConfirmation,
|
|
2185
2306
|
probeReachability,
|
|
2186
2307
|
recovery,
|
|
2187
2308
|
relationshipMap,
|
|
2188
2309
|
resolveAny,
|
|
2189
|
-
resourceForEntityType,
|
|
2190
2310
|
revenueRollup,
|
|
2311
|
+
sanitiseResult,
|
|
2191
2312
|
searchAcrossResources,
|
|
2192
2313
|
uiLink,
|
|
2193
2314
|
unknownKeysRefusal,
|
package/dist/pool.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
3
|
+
var _chunkMYL34QU5cjs = require('./chunk-MYL34QU5.cjs');
|
|
4
|
+
require('./chunk-HD5BRA3Z.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
10
|
-
require('./chunk-
|
|
9
|
+
var _chunkSEFJJY4Jcjs = require('./chunk-SEFJJY4J.cjs');
|
|
10
|
+
require('./chunk-VEOSOIU4.cjs');
|
|
11
11
|
require('./chunk-MJTKK3QG.cjs');
|
|
12
12
|
|
|
13
13
|
// src/pool.ts
|
|
@@ -15,7 +15,7 @@ var _crypto = require('crypto');
|
|
|
15
15
|
function createClientPool(options = {}) {
|
|
16
16
|
const maxSize = _nullishCoalesce(options.maxSize, () => ( 128));
|
|
17
17
|
if (!Number.isInteger(maxSize) || maxSize < 1) {
|
|
18
|
-
throw new (0,
|
|
18
|
+
throw new (0, _chunkSEFJJY4Jcjs.AutotaskConfigError)(
|
|
19
19
|
`ClientPool maxSize must be a positive integer (got ${String(options.maxSize)})`
|
|
20
20
|
);
|
|
21
21
|
}
|
|
@@ -30,7 +30,7 @@ function createClientPool(options = {}) {
|
|
|
30
30
|
readCaches.set(key, existing);
|
|
31
31
|
return existing;
|
|
32
32
|
}
|
|
33
|
-
const created =
|
|
33
|
+
const created = _chunkSEFJJY4Jcjs.buildReadCache.call(void 0, config);
|
|
34
34
|
if (created === void 0) return void 0;
|
|
35
35
|
readCaches.set(key, created);
|
|
36
36
|
while (readCaches.size > maxSize) {
|
|
@@ -47,7 +47,7 @@ function createClientPool(options = {}) {
|
|
|
47
47
|
return { ...config, cache };
|
|
48
48
|
}
|
|
49
49
|
function keyFor(config) {
|
|
50
|
-
const resolved =
|
|
50
|
+
const resolved = _chunkSEFJJY4Jcjs.resolveCredentials.call(void 0, config);
|
|
51
51
|
const tuple = [
|
|
52
52
|
resolved.userName,
|
|
53
53
|
resolved.apiIntegrationCode,
|
|
@@ -70,7 +70,7 @@ function createClientPool(options = {}) {
|
|
|
70
70
|
const oldest = entries.keys().next().value;
|
|
71
71
|
if (oldest !== void 0) entries.delete(oldest);
|
|
72
72
|
}
|
|
73
|
-
const client = new (0,
|
|
73
|
+
const client = new (0, _chunkMYL34QU5cjs.AutotaskClient)(withSharedCache(config, sharedCacheFor(key, config)));
|
|
74
74
|
entries.set(key, client);
|
|
75
75
|
return client;
|
|
76
76
|
},
|
package/dist/pool.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { A as AutotaskConfig, a as AutotaskClient } from './index-
|
|
1
|
+
import { A as AutotaskConfig, a as AutotaskClient } from './index-Cm_Xpt7X.cjs';
|
|
2
|
+
import './index-C3KFMnRT.cjs';
|
|
2
3
|
|
|
3
4
|
interface ClientPoolOptions {
|
|
4
5
|
/** Bounded LRU capacity (positive integer). Default 128. */
|
package/dist/pool.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { A as AutotaskConfig, a as AutotaskClient } from './index-
|
|
1
|
+
import { A as AutotaskConfig, a as AutotaskClient } from './index-C7rMJ4IV.js';
|
|
2
|
+
import './index-C3KFMnRT.js';
|
|
2
3
|
|
|
3
4
|
interface ClientPoolOptions {
|
|
4
5
|
/** Bounded LRU capacity (positive integer). Default 128. */
|
package/dist/pool.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AutotaskClient
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-ZR24JGW2.js";
|
|
4
|
+
import "./chunk-TTPHVFPJ.js";
|
|
5
5
|
import {
|
|
6
6
|
AutotaskConfigError,
|
|
7
7
|
buildReadCache,
|
|
8
8
|
resolveCredentials
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-AETFO6BO.js";
|
|
10
|
+
import "./chunk-WP33PQVM.js";
|
|
11
11
|
import "./chunk-5VHSLJMR.js";
|
|
12
12
|
|
|
13
13
|
// src/pool.ts
|
package/dist/resources/index.cjs
CHANGED
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
|
|
127
127
|
|
|
128
128
|
|
|
129
|
-
var
|
|
129
|
+
var _chunkHD5BRA3Zcjs = require('../chunk-HD5BRA3Z.cjs');
|
|
130
130
|
|
|
131
131
|
|
|
132
132
|
|
|
@@ -138,8 +138,8 @@ var _chunkEUGSF3U4cjs = require('../chunk-EUGSF3U4.cjs');
|
|
|
138
138
|
|
|
139
139
|
|
|
140
140
|
|
|
141
|
-
var
|
|
142
|
-
require('../chunk-
|
|
141
|
+
var _chunkSEFJJY4Jcjs = require('../chunk-SEFJJY4J.cjs');
|
|
142
|
+
require('../chunk-VEOSOIU4.cjs');
|
|
143
143
|
require('../chunk-MJTKK3QG.cjs');
|
|
144
144
|
|
|
145
145
|
|
|
@@ -278,4 +278,4 @@ require('../chunk-MJTKK3QG.cjs');
|
|
|
278
278
|
|
|
279
279
|
|
|
280
280
|
|
|
281
|
-
exports.AppointmentsResource = _chunkEUGSF3U4cjs.AppointmentsResource; exports.AuthenticateResource = _chunkEUGSF3U4cjs.AuthenticateResource; exports.BillingCodesResource = _chunkFEYVLIHDcjs.BillingCodesResource; exports.BillingItemApprovalLevelsResource = _chunkEUGSF3U4cjs.BillingItemApprovalLevelsResource; exports.BillingItemsResource = _chunkFEYVLIHDcjs.BillingItemsResource; exports.ChangeRequestLinksResource = _chunkEUGSF3U4cjs.ChangeRequestLinksResource; exports.ChecklistLibrariesResource = _chunkEUGSF3U4cjs.ChecklistLibrariesResource; exports.ChecklistLibraryChecklistItemsResource = _chunkEUGSF3U4cjs.ChecklistLibraryChecklistItemsResource; exports.ClassificationIconsResource = _chunkEUGSF3U4cjs.ClassificationIconsResource; exports.CompaniesResource = _chunkFEYVLIHDcjs.CompaniesResource; exports.CompanyAlertsResource = _chunkEUGSF3U4cjs.CompanyAlertsResource; exports.CompanyLocationsResource = _chunkEUGSF3U4cjs.CompanyLocationsResource; exports.CompanyNotesResource = _chunkEUGSF3U4cjs.CompanyNotesResource; exports.CompanySiteConfigurationsResource = _chunkEUGSF3U4cjs.CompanySiteConfigurationsResource; exports.CompanyWebhooksResource = _chunkEUGSF3U4cjs.CompanyWebhooksResource; exports.ConfigurationItemBillingProductAssociationsResource = _chunkEUGSF3U4cjs.ConfigurationItemBillingProductAssociationsResource; exports.ConfigurationItemCategoriesResource = _chunkEUGSF3U4cjs.ConfigurationItemCategoriesResource; exports.ConfigurationItemCategoryUdfAssociationsResource = _chunkEUGSF3U4cjs.ConfigurationItemCategoryUdfAssociationsResource; exports.ConfigurationItemDnsRecordsResource = _chunkEUGSF3U4cjs.ConfigurationItemDnsRecordsResource; exports.ConfigurationItemNotesResource = _chunkEUGSF3U4cjs.ConfigurationItemNotesResource; exports.ConfigurationItemRelatedItemsResource = _chunkEUGSF3U4cjs.ConfigurationItemRelatedItemsResource; exports.ConfigurationItemSslSubjectAlternativeNamesResource = _chunkEUGSF3U4cjs.ConfigurationItemSslSubjectAlternativeNamesResource; exports.ConfigurationItemTypesResource = _chunkEUGSF3U4cjs.ConfigurationItemTypesResource; exports.ConfigurationItemWebhooksResource = _chunkEUGSF3U4cjs.ConfigurationItemWebhooksResource; exports.ConfigurationItemsResource = _chunkEUGSF3U4cjs.ConfigurationItemsResource; exports.ContactGroupContactsResource = _chunkEUGSF3U4cjs.ContactGroupContactsResource; exports.ContactGroupsResource = _chunkEUGSF3U4cjs.ContactGroupsResource; exports.ContactWebhooksResource = _chunkEUGSF3U4cjs.ContactWebhooksResource; exports.ContactsResource = _chunkEUGSF3U4cjs.ContactsResource; exports.ContractBillingRulesResource = _chunkEUGSF3U4cjs.ContractBillingRulesResource; exports.ContractBlockHourFactorsResource = _chunkEUGSF3U4cjs.ContractBlockHourFactorsResource; exports.ContractBlocksResource = _chunkEUGSF3U4cjs.ContractBlocksResource; exports.ContractChargesResource = _chunkEUGSF3U4cjs.ContractChargesResource; exports.ContractExclusionBillingCodesResource = _chunkEUGSF3U4cjs.ContractExclusionBillingCodesResource; exports.ContractExclusionRolesResource = _chunkEUGSF3U4cjs.ContractExclusionRolesResource; exports.ContractExclusionSetExcludedRolesResource = _chunkEUGSF3U4cjs.ContractExclusionSetExcludedRolesResource; exports.ContractExclusionSetExcludedWorkTypesResource = _chunkEUGSF3U4cjs.ContractExclusionSetExcludedWorkTypesResource; exports.ContractExclusionSetsResource = _chunkEUGSF3U4cjs.ContractExclusionSetsResource; exports.ContractMilestonesResource = _chunkEUGSF3U4cjs.ContractMilestonesResource; exports.ContractNotesResource = _chunkEUGSF3U4cjs.ContractNotesResource; exports.ContractRatesResource = _chunkEUGSF3U4cjs.ContractRatesResource; exports.ContractRetainersResource = _chunkEUGSF3U4cjs.ContractRetainersResource; exports.ContractRoleCostsResource = _chunkEUGSF3U4cjs.ContractRoleCostsResource; exports.ContractServiceAdjustmentsResource = _chunkEUGSF3U4cjs.ContractServiceAdjustmentsResource; exports.ContractServiceBundleAdjustmentsResource = _chunkEUGSF3U4cjs.ContractServiceBundleAdjustmentsResource; exports.ContractServiceBundleUnitsResource = _chunkEUGSF3U4cjs.ContractServiceBundleUnitsResource; exports.ContractServiceBundlesResource = _chunkEUGSF3U4cjs.ContractServiceBundlesResource; exports.ContractServiceUnitsResource = _chunkEUGSF3U4cjs.ContractServiceUnitsResource; exports.ContractServicesResource = _chunkEUGSF3U4cjs.ContractServicesResource; exports.ContractTicketPurchasesResource = _chunkEUGSF3U4cjs.ContractTicketPurchasesResource; exports.ContractsResource = _chunkFEYVLIHDcjs.ContractsResource; exports.CountriesResource = _chunkEUGSF3U4cjs.CountriesResource; exports.CurrenciesResource = _chunkEUGSF3U4cjs.CurrenciesResource; exports.DepartmentsResource = _chunkEUGSF3U4cjs.DepartmentsResource; exports.DomainRegistrarsResource = _chunkEUGSF3U4cjs.DomainRegistrarsResource; exports.EntityInformationResource = _chunkEUGSF3U4cjs.EntityInformationResource; exports.ExpenseItemAttachmentsResource = _chunkEUGSF3U4cjs.ExpenseItemAttachmentsResource; exports.ExpenseItemsResource = _chunkEUGSF3U4cjs.ExpenseItemsResource; exports.ExpenseReportsResource = _chunkEUGSF3U4cjs.ExpenseReportsResource; exports.HolidaySetsResource = _chunkEUGSF3U4cjs.HolidaySetsResource; exports.HolidaysResource = _chunkEUGSF3U4cjs.HolidaysResource; exports.InventoryProductsResource = _chunkEUGSF3U4cjs.InventoryProductsResource; exports.InvoiceTemplatesResource = _chunkEUGSF3U4cjs.InvoiceTemplatesResource; exports.InvoicesResource = _chunkFEYVLIHDcjs.InvoicesResource; exports.ModulesResource = _chunkEUGSF3U4cjs.ModulesResource; exports.NotificationHistoryResource = _chunkEUGSF3U4cjs.NotificationHistoryResource; exports.OpportunitiesResource = _chunkEUGSF3U4cjs.OpportunitiesResource; exports.OpportunityAttachmentsResource = _chunkEUGSF3U4cjs.OpportunityAttachmentsResource; exports.OpportunityCategoriesResource = _chunkEUGSF3U4cjs.OpportunityCategoriesResource; exports.OrganizationalLevel1sResource = _chunkFEYVLIHDcjs.OrganizationalLevel1sResource; exports.OrganizationalLevel2sResource = _chunkFEYVLIHDcjs.OrganizationalLevel2sResource; exports.OrganizationalLevelAssociationsResource = _chunkFEYVLIHDcjs.OrganizationalLevelAssociationsResource; exports.PhasesResource = _chunkEUGSF3U4cjs.PhasesResource; exports.ProductVendorsResource = _chunkEUGSF3U4cjs.ProductVendorsResource; exports.ProductsResource = _chunkEUGSF3U4cjs.ProductsResource; exports.ProjectChargesResource = _chunkEUGSF3U4cjs.ProjectChargesResource; exports.ProjectNotesResource = _chunkEUGSF3U4cjs.ProjectNotesResource; exports.ProjectsResource = _chunkEUGSF3U4cjs.ProjectsResource; exports.PurchaseApprovalsResource = _chunkEUGSF3U4cjs.PurchaseApprovalsResource; exports.PurchaseOrderItemReceivingResource = _chunkEUGSF3U4cjs.PurchaseOrderItemReceivingResource; exports.PurchaseOrderItemsResource = _chunkEUGSF3U4cjs.PurchaseOrderItemsResource; exports.PurchaseOrdersResource = _chunkEUGSF3U4cjs.PurchaseOrdersResource; exports.QuoteItemsResource = _chunkEUGSF3U4cjs.QuoteItemsResource; exports.QuoteLocationsResource = _chunkEUGSF3U4cjs.QuoteLocationsResource; exports.QuoteTemplatesResource = _chunkEUGSF3U4cjs.QuoteTemplatesResource; exports.QuotesResource = _chunkEUGSF3U4cjs.QuotesResource; exports.ResourceRoleQueuesResource = _chunkEUGSF3U4cjs.ResourceRoleQueuesResource; exports.ResourceRolesResource = _chunkEUGSF3U4cjs.ResourceRolesResource; exports.ResourceSkillsResource = _chunkEUGSF3U4cjs.ResourceSkillsResource; exports.ResourceTimeOffAdditionalResource = _chunkEUGSF3U4cjs.ResourceTimeOffAdditionalResource; exports.ResourceTimeOffApproversResource = _chunkEUGSF3U4cjs.ResourceTimeOffApproversResource; exports.ResourceTimeOffBalancesResource = _chunkEUGSF3U4cjs.ResourceTimeOffBalancesResource; exports.ResourcesResource = _chunkFEYVLIHDcjs.ResourcesResource; exports.RolesResource = _chunkEUGSF3U4cjs.RolesResource; exports.SalesOrdersResource = _chunkEUGSF3U4cjs.SalesOrdersResource; exports.ServiceCallTaskResourcesResource = _chunkEUGSF3U4cjs.ServiceCallTaskResourcesResource; exports.ServiceCallTasksResource = _chunkEUGSF3U4cjs.ServiceCallTasksResource; exports.ServiceCallTicketResourcesResource = _chunkEUGSF3U4cjs.ServiceCallTicketResourcesResource; exports.ServiceCallTicketsResource = _chunkEUGSF3U4cjs.ServiceCallTicketsResource; exports.ServiceCallsResource = _chunkEUGSF3U4cjs.ServiceCallsResource; exports.ServiceLevelAgreementResultsResource = _chunkEUGSF3U4cjs.ServiceLevelAgreementResultsResource; exports.ServicesResource = _chunkEUGSF3U4cjs.ServicesResource; exports.SkillsResource = _chunkEUGSF3U4cjs.SkillsResource; exports.SubscriptionPeriodsResource = _chunkEUGSF3U4cjs.SubscriptionPeriodsResource; exports.SubscriptionsResource = _chunkEUGSF3U4cjs.SubscriptionsResource; exports.SurveyResultsResource = _chunkEUGSF3U4cjs.SurveyResultsResource; exports.SurveysResource = _chunkEUGSF3U4cjs.SurveysResource; exports.TagAliasesResource = _chunkEUGSF3U4cjs.TagAliasesResource; exports.TagGroupsResource = _chunkEUGSF3U4cjs.TagGroupsResource; exports.TagsResource = _chunkEUGSF3U4cjs.TagsResource; exports.TaskSecondaryResourcesResource = _chunkEUGSF3U4cjs.TaskSecondaryResourcesResource; exports.TasksResource = _chunkEUGSF3U4cjs.TasksResource; exports.TaxRegionsResource = _chunkEUGSF3U4cjs.TaxRegionsResource; exports.ThresholdInformationResource = _chunkEUGSF3U4cjs.ThresholdInformationResource; exports.TicketAdditionalConfigurationItemsResource = _chunkEUGSF3U4cjs.TicketAdditionalConfigurationItemsResource; exports.TicketAdditionalContactsResource = _chunkEUGSF3U4cjs.TicketAdditionalContactsResource; exports.TicketAttachmentsResource = _chunkEUGSF3U4cjs.TicketAttachmentsResource; exports.TicketCategoriesResource = _chunkEUGSF3U4cjs.TicketCategoriesResource; exports.TicketCategoryFieldDefaultsResource = _chunkEUGSF3U4cjs.TicketCategoryFieldDefaultsResource; exports.TicketChangeRequestApprovalsResource = _chunkEUGSF3U4cjs.TicketChangeRequestApprovalsResource; exports.TicketChargesResource = _chunkEUGSF3U4cjs.TicketChargesResource; exports.TicketChecklistItemsResource = _chunkEUGSF3U4cjs.TicketChecklistItemsResource; exports.TicketChecklistLibrariesResource = _chunkEUGSF3U4cjs.TicketChecklistLibrariesResource; exports.TicketHistoryResource = _chunkEUGSF3U4cjs.TicketHistoryResource; exports.TicketNoteAttachmentsResource = _chunkEUGSF3U4cjs.TicketNoteAttachmentsResource; exports.TicketNoteWebhooksResource = _chunkEUGSF3U4cjs.TicketNoteWebhooksResource; exports.TicketNotesResource = _chunkEUGSF3U4cjs.TicketNotesResource; exports.TicketSecondaryResourcesResource = _chunkEUGSF3U4cjs.TicketSecondaryResourcesResource; exports.TicketWebhooksResource = _chunkEUGSF3U4cjs.TicketWebhooksResource; exports.TicketsResource = _chunkEUGSF3U4cjs.TicketsResource; exports.TimeEntriesResource = _chunkFEYVLIHDcjs.TimeEntriesResource; exports.TimeEntryAttachmentsResource = _chunkEUGSF3U4cjs.TimeEntryAttachmentsResource; exports.TimeOffRequestsResource = _chunkEUGSF3U4cjs.TimeOffRequestsResource; exports.VersionInformationResource = _chunkEUGSF3U4cjs.VersionInformationResource; exports.VersionResource = _chunkEUGSF3U4cjs.VersionResource; exports.ZoneInformationResource = _chunkEUGSF3U4cjs.ZoneInformationResource;
|
|
281
|
+
exports.AppointmentsResource = _chunkHD5BRA3Zcjs.AppointmentsResource; exports.AuthenticateResource = _chunkHD5BRA3Zcjs.AuthenticateResource; exports.BillingCodesResource = _chunkSEFJJY4Jcjs.BillingCodesResource; exports.BillingItemApprovalLevelsResource = _chunkHD5BRA3Zcjs.BillingItemApprovalLevelsResource; exports.BillingItemsResource = _chunkSEFJJY4Jcjs.BillingItemsResource; exports.ChangeRequestLinksResource = _chunkHD5BRA3Zcjs.ChangeRequestLinksResource; exports.ChecklistLibrariesResource = _chunkHD5BRA3Zcjs.ChecklistLibrariesResource; exports.ChecklistLibraryChecklistItemsResource = _chunkHD5BRA3Zcjs.ChecklistLibraryChecklistItemsResource; exports.ClassificationIconsResource = _chunkHD5BRA3Zcjs.ClassificationIconsResource; exports.CompaniesResource = _chunkSEFJJY4Jcjs.CompaniesResource; exports.CompanyAlertsResource = _chunkHD5BRA3Zcjs.CompanyAlertsResource; exports.CompanyLocationsResource = _chunkHD5BRA3Zcjs.CompanyLocationsResource; exports.CompanyNotesResource = _chunkHD5BRA3Zcjs.CompanyNotesResource; exports.CompanySiteConfigurationsResource = _chunkHD5BRA3Zcjs.CompanySiteConfigurationsResource; exports.CompanyWebhooksResource = _chunkHD5BRA3Zcjs.CompanyWebhooksResource; exports.ConfigurationItemBillingProductAssociationsResource = _chunkHD5BRA3Zcjs.ConfigurationItemBillingProductAssociationsResource; exports.ConfigurationItemCategoriesResource = _chunkHD5BRA3Zcjs.ConfigurationItemCategoriesResource; exports.ConfigurationItemCategoryUdfAssociationsResource = _chunkHD5BRA3Zcjs.ConfigurationItemCategoryUdfAssociationsResource; exports.ConfigurationItemDnsRecordsResource = _chunkHD5BRA3Zcjs.ConfigurationItemDnsRecordsResource; exports.ConfigurationItemNotesResource = _chunkHD5BRA3Zcjs.ConfigurationItemNotesResource; exports.ConfigurationItemRelatedItemsResource = _chunkHD5BRA3Zcjs.ConfigurationItemRelatedItemsResource; exports.ConfigurationItemSslSubjectAlternativeNamesResource = _chunkHD5BRA3Zcjs.ConfigurationItemSslSubjectAlternativeNamesResource; exports.ConfigurationItemTypesResource = _chunkHD5BRA3Zcjs.ConfigurationItemTypesResource; exports.ConfigurationItemWebhooksResource = _chunkHD5BRA3Zcjs.ConfigurationItemWebhooksResource; exports.ConfigurationItemsResource = _chunkHD5BRA3Zcjs.ConfigurationItemsResource; exports.ContactGroupContactsResource = _chunkHD5BRA3Zcjs.ContactGroupContactsResource; exports.ContactGroupsResource = _chunkHD5BRA3Zcjs.ContactGroupsResource; exports.ContactWebhooksResource = _chunkHD5BRA3Zcjs.ContactWebhooksResource; exports.ContactsResource = _chunkHD5BRA3Zcjs.ContactsResource; exports.ContractBillingRulesResource = _chunkHD5BRA3Zcjs.ContractBillingRulesResource; exports.ContractBlockHourFactorsResource = _chunkHD5BRA3Zcjs.ContractBlockHourFactorsResource; exports.ContractBlocksResource = _chunkHD5BRA3Zcjs.ContractBlocksResource; exports.ContractChargesResource = _chunkHD5BRA3Zcjs.ContractChargesResource; exports.ContractExclusionBillingCodesResource = _chunkHD5BRA3Zcjs.ContractExclusionBillingCodesResource; exports.ContractExclusionRolesResource = _chunkHD5BRA3Zcjs.ContractExclusionRolesResource; exports.ContractExclusionSetExcludedRolesResource = _chunkHD5BRA3Zcjs.ContractExclusionSetExcludedRolesResource; exports.ContractExclusionSetExcludedWorkTypesResource = _chunkHD5BRA3Zcjs.ContractExclusionSetExcludedWorkTypesResource; exports.ContractExclusionSetsResource = _chunkHD5BRA3Zcjs.ContractExclusionSetsResource; exports.ContractMilestonesResource = _chunkHD5BRA3Zcjs.ContractMilestonesResource; exports.ContractNotesResource = _chunkHD5BRA3Zcjs.ContractNotesResource; exports.ContractRatesResource = _chunkHD5BRA3Zcjs.ContractRatesResource; exports.ContractRetainersResource = _chunkHD5BRA3Zcjs.ContractRetainersResource; exports.ContractRoleCostsResource = _chunkHD5BRA3Zcjs.ContractRoleCostsResource; exports.ContractServiceAdjustmentsResource = _chunkHD5BRA3Zcjs.ContractServiceAdjustmentsResource; exports.ContractServiceBundleAdjustmentsResource = _chunkHD5BRA3Zcjs.ContractServiceBundleAdjustmentsResource; exports.ContractServiceBundleUnitsResource = _chunkHD5BRA3Zcjs.ContractServiceBundleUnitsResource; exports.ContractServiceBundlesResource = _chunkHD5BRA3Zcjs.ContractServiceBundlesResource; exports.ContractServiceUnitsResource = _chunkHD5BRA3Zcjs.ContractServiceUnitsResource; exports.ContractServicesResource = _chunkHD5BRA3Zcjs.ContractServicesResource; exports.ContractTicketPurchasesResource = _chunkHD5BRA3Zcjs.ContractTicketPurchasesResource; exports.ContractsResource = _chunkSEFJJY4Jcjs.ContractsResource; exports.CountriesResource = _chunkHD5BRA3Zcjs.CountriesResource; exports.CurrenciesResource = _chunkHD5BRA3Zcjs.CurrenciesResource; exports.DepartmentsResource = _chunkHD5BRA3Zcjs.DepartmentsResource; exports.DomainRegistrarsResource = _chunkHD5BRA3Zcjs.DomainRegistrarsResource; exports.EntityInformationResource = _chunkHD5BRA3Zcjs.EntityInformationResource; exports.ExpenseItemAttachmentsResource = _chunkHD5BRA3Zcjs.ExpenseItemAttachmentsResource; exports.ExpenseItemsResource = _chunkHD5BRA3Zcjs.ExpenseItemsResource; exports.ExpenseReportsResource = _chunkHD5BRA3Zcjs.ExpenseReportsResource; exports.HolidaySetsResource = _chunkHD5BRA3Zcjs.HolidaySetsResource; exports.HolidaysResource = _chunkHD5BRA3Zcjs.HolidaysResource; exports.InventoryProductsResource = _chunkHD5BRA3Zcjs.InventoryProductsResource; exports.InvoiceTemplatesResource = _chunkHD5BRA3Zcjs.InvoiceTemplatesResource; exports.InvoicesResource = _chunkSEFJJY4Jcjs.InvoicesResource; exports.ModulesResource = _chunkHD5BRA3Zcjs.ModulesResource; exports.NotificationHistoryResource = _chunkHD5BRA3Zcjs.NotificationHistoryResource; exports.OpportunitiesResource = _chunkHD5BRA3Zcjs.OpportunitiesResource; exports.OpportunityAttachmentsResource = _chunkHD5BRA3Zcjs.OpportunityAttachmentsResource; exports.OpportunityCategoriesResource = _chunkHD5BRA3Zcjs.OpportunityCategoriesResource; exports.OrganizationalLevel1sResource = _chunkSEFJJY4Jcjs.OrganizationalLevel1sResource; exports.OrganizationalLevel2sResource = _chunkSEFJJY4Jcjs.OrganizationalLevel2sResource; exports.OrganizationalLevelAssociationsResource = _chunkSEFJJY4Jcjs.OrganizationalLevelAssociationsResource; exports.PhasesResource = _chunkHD5BRA3Zcjs.PhasesResource; exports.ProductVendorsResource = _chunkHD5BRA3Zcjs.ProductVendorsResource; exports.ProductsResource = _chunkHD5BRA3Zcjs.ProductsResource; exports.ProjectChargesResource = _chunkHD5BRA3Zcjs.ProjectChargesResource; exports.ProjectNotesResource = _chunkHD5BRA3Zcjs.ProjectNotesResource; exports.ProjectsResource = _chunkHD5BRA3Zcjs.ProjectsResource; exports.PurchaseApprovalsResource = _chunkHD5BRA3Zcjs.PurchaseApprovalsResource; exports.PurchaseOrderItemReceivingResource = _chunkHD5BRA3Zcjs.PurchaseOrderItemReceivingResource; exports.PurchaseOrderItemsResource = _chunkHD5BRA3Zcjs.PurchaseOrderItemsResource; exports.PurchaseOrdersResource = _chunkHD5BRA3Zcjs.PurchaseOrdersResource; exports.QuoteItemsResource = _chunkHD5BRA3Zcjs.QuoteItemsResource; exports.QuoteLocationsResource = _chunkHD5BRA3Zcjs.QuoteLocationsResource; exports.QuoteTemplatesResource = _chunkHD5BRA3Zcjs.QuoteTemplatesResource; exports.QuotesResource = _chunkHD5BRA3Zcjs.QuotesResource; exports.ResourceRoleQueuesResource = _chunkHD5BRA3Zcjs.ResourceRoleQueuesResource; exports.ResourceRolesResource = _chunkHD5BRA3Zcjs.ResourceRolesResource; exports.ResourceSkillsResource = _chunkHD5BRA3Zcjs.ResourceSkillsResource; exports.ResourceTimeOffAdditionalResource = _chunkHD5BRA3Zcjs.ResourceTimeOffAdditionalResource; exports.ResourceTimeOffApproversResource = _chunkHD5BRA3Zcjs.ResourceTimeOffApproversResource; exports.ResourceTimeOffBalancesResource = _chunkHD5BRA3Zcjs.ResourceTimeOffBalancesResource; exports.ResourcesResource = _chunkSEFJJY4Jcjs.ResourcesResource; exports.RolesResource = _chunkHD5BRA3Zcjs.RolesResource; exports.SalesOrdersResource = _chunkHD5BRA3Zcjs.SalesOrdersResource; exports.ServiceCallTaskResourcesResource = _chunkHD5BRA3Zcjs.ServiceCallTaskResourcesResource; exports.ServiceCallTasksResource = _chunkHD5BRA3Zcjs.ServiceCallTasksResource; exports.ServiceCallTicketResourcesResource = _chunkHD5BRA3Zcjs.ServiceCallTicketResourcesResource; exports.ServiceCallTicketsResource = _chunkHD5BRA3Zcjs.ServiceCallTicketsResource; exports.ServiceCallsResource = _chunkHD5BRA3Zcjs.ServiceCallsResource; exports.ServiceLevelAgreementResultsResource = _chunkHD5BRA3Zcjs.ServiceLevelAgreementResultsResource; exports.ServicesResource = _chunkHD5BRA3Zcjs.ServicesResource; exports.SkillsResource = _chunkHD5BRA3Zcjs.SkillsResource; exports.SubscriptionPeriodsResource = _chunkHD5BRA3Zcjs.SubscriptionPeriodsResource; exports.SubscriptionsResource = _chunkHD5BRA3Zcjs.SubscriptionsResource; exports.SurveyResultsResource = _chunkHD5BRA3Zcjs.SurveyResultsResource; exports.SurveysResource = _chunkHD5BRA3Zcjs.SurveysResource; exports.TagAliasesResource = _chunkHD5BRA3Zcjs.TagAliasesResource; exports.TagGroupsResource = _chunkHD5BRA3Zcjs.TagGroupsResource; exports.TagsResource = _chunkHD5BRA3Zcjs.TagsResource; exports.TaskSecondaryResourcesResource = _chunkHD5BRA3Zcjs.TaskSecondaryResourcesResource; exports.TasksResource = _chunkHD5BRA3Zcjs.TasksResource; exports.TaxRegionsResource = _chunkHD5BRA3Zcjs.TaxRegionsResource; exports.ThresholdInformationResource = _chunkHD5BRA3Zcjs.ThresholdInformationResource; exports.TicketAdditionalConfigurationItemsResource = _chunkHD5BRA3Zcjs.TicketAdditionalConfigurationItemsResource; exports.TicketAdditionalContactsResource = _chunkHD5BRA3Zcjs.TicketAdditionalContactsResource; exports.TicketAttachmentsResource = _chunkHD5BRA3Zcjs.TicketAttachmentsResource; exports.TicketCategoriesResource = _chunkHD5BRA3Zcjs.TicketCategoriesResource; exports.TicketCategoryFieldDefaultsResource = _chunkHD5BRA3Zcjs.TicketCategoryFieldDefaultsResource; exports.TicketChangeRequestApprovalsResource = _chunkHD5BRA3Zcjs.TicketChangeRequestApprovalsResource; exports.TicketChargesResource = _chunkHD5BRA3Zcjs.TicketChargesResource; exports.TicketChecklistItemsResource = _chunkHD5BRA3Zcjs.TicketChecklistItemsResource; exports.TicketChecklistLibrariesResource = _chunkHD5BRA3Zcjs.TicketChecklistLibrariesResource; exports.TicketHistoryResource = _chunkHD5BRA3Zcjs.TicketHistoryResource; exports.TicketNoteAttachmentsResource = _chunkHD5BRA3Zcjs.TicketNoteAttachmentsResource; exports.TicketNoteWebhooksResource = _chunkHD5BRA3Zcjs.TicketNoteWebhooksResource; exports.TicketNotesResource = _chunkHD5BRA3Zcjs.TicketNotesResource; exports.TicketSecondaryResourcesResource = _chunkHD5BRA3Zcjs.TicketSecondaryResourcesResource; exports.TicketWebhooksResource = _chunkHD5BRA3Zcjs.TicketWebhooksResource; exports.TicketsResource = _chunkHD5BRA3Zcjs.TicketsResource; exports.TimeEntriesResource = _chunkSEFJJY4Jcjs.TimeEntriesResource; exports.TimeEntryAttachmentsResource = _chunkHD5BRA3Zcjs.TimeEntryAttachmentsResource; exports.TimeOffRequestsResource = _chunkHD5BRA3Zcjs.TimeOffRequestsResource; exports.VersionInformationResource = _chunkHD5BRA3Zcjs.VersionInformationResource; exports.VersionResource = _chunkHD5BRA3Zcjs.VersionResource; exports.ZoneInformationResource = _chunkHD5BRA3Zcjs.ZoneInformationResource;
|