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.
Files changed (44) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/MCP_TOOL_CATALOG.json +147 -149
  3. package/MCP_TOOL_MANIFEST.md +9 -9
  4. package/N8N_MCP_MANIFEST.json +4 -43
  5. package/N8N_MCP_MANIFEST.md +6 -7
  6. package/README.md +3 -4
  7. package/capabilities.json +3945 -3405
  8. package/dist/capabilities.cjs +2 -2
  9. package/dist/capabilities.js +1 -1
  10. package/dist/{chunk-VDVBXXJW.js → chunk-AETFO6BO.js} +1765 -1880
  11. package/dist/{chunk-EUGSF3U4.cjs → chunk-HD5BRA3Z.cjs} +285 -285
  12. package/dist/{chunk-E5W24BZB.cjs → chunk-MYL34QU5.cjs} +143 -143
  13. package/dist/{chunk-FEYVLIHD.cjs → chunk-SEFJJY4J.cjs} +2801 -2916
  14. package/dist/{chunk-O32L6GS5.js → chunk-TTPHVFPJ.js} +2 -2
  15. package/dist/{chunk-EVDVESQM.cjs → chunk-VEOSOIU4.cjs} +3944 -3404
  16. package/dist/{chunk-Y6YJYKBZ.js → chunk-WP33PQVM.js} +3944 -3404
  17. package/dist/{chunk-MTFRSD7P.js → chunk-ZR24JGW2.js} +2 -2
  18. package/dist/index-C3KFMnRT.d.cts +6860 -0
  19. package/dist/index-C3KFMnRT.d.ts +6860 -0
  20. package/dist/{index-BKp8_P2L.d.cts → index-C7rMJ4IV.d.ts} +139 -7236
  21. package/dist/{index-BKp8_P2L.d.ts → index-Cm_Xpt7X.d.cts} +139 -7236
  22. package/dist/index.cjs +22 -24
  23. package/dist/index.d.cts +58 -34
  24. package/dist/index.d.ts +58 -34
  25. package/dist/index.js +8 -10
  26. package/dist/operations/index.cjs +363 -242
  27. package/dist/operations/index.d.cts +281 -25
  28. package/dist/operations/index.d.ts +281 -25
  29. package/dist/operations/index.js +178 -57
  30. package/dist/pool.cjs +8 -8
  31. package/dist/pool.d.cts +2 -1
  32. package/dist/pool.d.ts +2 -1
  33. package/dist/pool.js +4 -4
  34. package/dist/resources/index.cjs +4 -4
  35. package/dist/resources/index.d.cts +2 -1
  36. package/dist/resources/index.d.ts +2 -1
  37. package/dist/resources/index.js +3 -3
  38. package/dist/types/index.d.cts +1 -1
  39. package/dist/types/index.d.ts +1 -1
  40. package/docs/API.md +101 -139
  41. package/docs/LIVE-TESTING.md +9 -5
  42. package/docs/N8N-ADAPTER.md +1 -1
  43. package/docs/RELEASING.md +121 -0
  44. package/package.json +3 -2
@@ -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
- } from "../chunk-VDVBXXJW.js";
71
+ validateQueryFieldNames,
72
+ validateWalkBag
73
+ } from "../chunk-AETFO6BO.js";
73
74
  import {
74
75
  CAPABILITIES
75
- } from "../chunk-Y6YJYKBZ.js";
76
- import "../chunk-5VHSLJMR.js";
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
- results.push({
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 labelled = opts.names === false || v.groupBy.length === 0 ? void 0 : await labelRows(client, v.resourceKey, top.map((g) => g.key));
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", "fieldsPreset", "fieldCheck", "names"],
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.map((k) => [k, suggestForKey(k, valid)]).filter((pair) => pair[1] !== null).map(([k, s]) => `"${k}" \u2192 "${s}"`);
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.map((k) => [k, suggestForKey(k, ["dryRun", "confirm", "lastModifiedDate", "maxRetries", "fresh"])]).filter((pair) => pair[1] !== null).map(([k, s]) => `"${k}" \u2192 "${s}"`);
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.map((k) => [k, suggestForKey(k, [...validKeys])]).filter((pair) => pair[1] !== null).map(([k, s]) => `"${k}" \u2192 "${s}"`);
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/invoke/registry.ts
1927
- var RECORDS = CAPABILITIES;
1928
- var byId2 = new Map(RECORDS.map((r) => [r.id, r]));
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 = byId2.get(operation);
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
- if (boundedQuery || countedQuery) await validateQueryFieldNames(record, holder, args);
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
- return Buffer.isBuffer(result) ? bufferResult(result) : result;
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 _chunkE5W24BZBcjs = require('./chunk-E5W24BZB.cjs');
4
- require('./chunk-EUGSF3U4.cjs');
3
+ var _chunkMYL34QU5cjs = require('./chunk-MYL34QU5.cjs');
4
+ require('./chunk-HD5BRA3Z.cjs');
5
5
 
6
6
 
7
7
 
8
8
 
9
- var _chunkFEYVLIHDcjs = require('./chunk-FEYVLIHD.cjs');
10
- require('./chunk-EVDVESQM.cjs');
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, _chunkFEYVLIHDcjs.AutotaskConfigError)(
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 = _chunkFEYVLIHDcjs.buildReadCache.call(void 0, config);
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 = _chunkFEYVLIHDcjs.resolveCredentials.call(void 0, config);
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, _chunkE5W24BZBcjs.AutotaskClient)(withSharedCache(config, sharedCacheFor(key, config)));
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-BKp8_P2L.cjs';
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-BKp8_P2L.js';
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-MTFRSD7P.js";
4
- import "./chunk-O32L6GS5.js";
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-VDVBXXJW.js";
10
- import "./chunk-Y6YJYKBZ.js";
9
+ } from "./chunk-AETFO6BO.js";
10
+ import "./chunk-WP33PQVM.js";
11
11
  import "./chunk-5VHSLJMR.js";
12
12
 
13
13
  // src/pool.ts
@@ -126,7 +126,7 @@
126
126
 
127
127
 
128
128
 
129
- var _chunkEUGSF3U4cjs = require('../chunk-EUGSF3U4.cjs');
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 _chunkFEYVLIHDcjs = require('../chunk-FEYVLIHD.cjs');
142
- require('../chunk-EVDVESQM.cjs');
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;