node-autotask 0.16.0 → 0.18.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 (40) hide show
  1. package/ARCHITECTURE.md +10 -4
  2. package/MCP_TOOL_CATALOG.json +2 -2
  3. package/MCP_TOOL_MANIFEST.md +4 -4
  4. package/N8N_MCP_MANIFEST.json +2 -2
  5. package/N8N_MCP_MANIFEST.md +3 -3
  6. package/README.md +36 -0
  7. package/capabilities.json +1571 -1571
  8. package/dist/capabilities.cjs +2 -2
  9. package/dist/capabilities.js +1 -1
  10. package/dist/{chunk-EWMG3HHU.cjs → chunk-5O5EPYBO.cjs} +1570 -1570
  11. package/dist/{chunk-L3TK4CN5.cjs → chunk-7I3F3AJJ.cjs} +429 -419
  12. package/dist/{chunk-VCGC6YCI.cjs → chunk-G564CHXM.cjs} +135 -135
  13. package/dist/{chunk-NB254T3F.js → chunk-HXOWEYV3.js} +49 -39
  14. package/dist/{chunk-JIDR3NPV.js → chunk-VV2UUW2J.js} +1570 -1570
  15. package/dist/{chunk-U6JUHHMB.js → chunk-VYUZZIEE.js} +66 -32
  16. package/dist/{chunk-GWALLMAM.js → chunk-W2WSZOZA.js} +2 -2
  17. package/dist/{chunk-MAYYTYV5.cjs → chunk-WRWX6WIK.cjs} +68 -34
  18. package/dist/{index-CUsvZndu.d.ts → index-BqPY04ZG.d.ts} +89 -16
  19. package/dist/{index-leMyBJze.d.cts → index-D7x3MkLK.d.cts} +89 -16
  20. package/dist/index.cjs +24 -22
  21. package/dist/index.d.cts +2 -2
  22. package/dist/index.d.ts +2 -2
  23. package/dist/index.js +6 -4
  24. package/dist/operations/index.cjs +178 -105
  25. package/dist/operations/index.d.cts +22 -7
  26. package/dist/operations/index.d.ts +22 -7
  27. package/dist/operations/index.js +77 -4
  28. package/dist/pool.cjs +8 -8
  29. package/dist/pool.d.cts +1 -1
  30. package/dist/pool.d.ts +1 -1
  31. package/dist/pool.js +4 -4
  32. package/dist/resources/index.cjs +4 -4
  33. package/dist/resources/index.d.cts +1 -1
  34. package/dist/resources/index.d.ts +1 -1
  35. package/dist/resources/index.js +3 -3
  36. package/docs/API.md +78 -15
  37. package/examples/basic.ts +2 -2
  38. package/examples/mcp-server-http.ts +5 -4
  39. package/examples/mcp-server.ts +3 -3
  40. package/package.json +3 -2
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CAPABILITIES
3
- } from "./chunk-JIDR3NPV.js";
3
+ } from "./chunk-VV2UUW2J.js";
4
4
 
5
5
  // src/auth.ts
6
6
  var AUTH_HEADERS = {
@@ -171,6 +171,7 @@ var AutotaskError = class extends Error {
171
171
  operation;
172
172
  httpStatus;
173
173
  vendorError;
174
+ /** Legacy unlabeled id list (issue #116) — see `AutotaskErrorOptions.resourceIds`; the labeled companion rides on `details.idRefs`. */
174
175
  resourceIds;
175
176
  suggestedAction;
176
177
  correlationId;
@@ -376,7 +377,8 @@ function parseVendorErrors(body) {
376
377
  var DETERMINISTIC_VENDOR_500_PHRASES = [
377
378
  /exceeds maximum length/i,
378
379
  /Missing Required Field/i,
379
- /Value does not exist for the required field/i
380
+ /Value does not exist for the required field/i,
381
+ /Unable to find .+ in the .+ Entity\./i
380
382
  ];
381
383
  function isDeterministicVendor500(entries) {
382
384
  if (entries === void 0) return false;
@@ -14688,12 +14690,26 @@ function normalizeZoneBase(raw) {
14688
14690
  if (url.protocol !== "http:" && url.protocol !== "https:") return void 0;
14689
14691
  return `${url.origin}${url.pathname.replace(/\/+$/, "")}`;
14690
14692
  }
14691
- function buildQueryRequest(baseUrl, resourcePath, params) {
14692
- const queryPath = `${resourcePath}/query`;
14693
+ function buildQueryBody(params) {
14693
14694
  const conditions = normalizedConditions(params.filter);
14694
14695
  const filter = conditions === void 0 ? void 0 : buildFilter(conditions);
14695
- const includeFields = params.includeFields === void 0 ? void 0 : params.includeFields.includes("id") ? params.includeFields : [...params.includeFields, "id"];
14696
+ const includeFields = effectiveIncludeFields(params);
14697
+ const body = {};
14698
+ if (params.maxRecords !== void 0) body.MaxRecords = params.maxRecords;
14699
+ if (includeFields !== void 0) body.IncludeFields = includeFields;
14700
+ body.filter = filter === void 0 ? [] : filter.filter;
14701
+ return body;
14702
+ }
14703
+ function effectiveIncludeFields(params) {
14704
+ if (params.includeFields === void 0) return void 0;
14705
+ return params.includeFields.includes("id") ? params.includeFields : [...params.includeFields, "id"];
14706
+ }
14707
+ function buildQueryRequest(baseUrl, resourcePath, params) {
14708
+ const queryPath = `${resourcePath}/query`;
14696
14709
  if (params.via === "get") {
14710
+ const conditions = normalizedConditions(params.filter);
14711
+ const filter = conditions === void 0 ? void 0 : buildFilter(conditions);
14712
+ const includeFields = effectiveIncludeFields(params);
14697
14713
  const search = {};
14698
14714
  if (filter !== void 0) search.filter = filter.filter;
14699
14715
  if (params.maxRecords !== void 0) search.maxRecords = params.maxRecords;
@@ -14711,11 +14727,7 @@ function buildQueryRequest(baseUrl, resourcePath, params) {
14711
14727
  }
14712
14728
  return req;
14713
14729
  }
14714
- const body = {};
14715
- if (params.maxRecords !== void 0) body.MaxRecords = params.maxRecords;
14716
- if (includeFields !== void 0) body.IncludeFields = includeFields;
14717
- body.filter = filter === void 0 ? [] : filter.filter;
14718
- return { method: "POST", path: queryPath, body, idempotent: true };
14730
+ return { method: "POST", path: queryPath, body: buildQueryBody(params), idempotent: true };
14719
14731
  }
14720
14732
  var ambientSignal = new AsyncLocalStorage();
14721
14733
  function runWithSignal(signal, fn) {
@@ -15655,7 +15667,7 @@ function unwrapItems(body, operation) {
15655
15667
  }
15656
15668
  return { items: body.items, pageDetails: body.pageDetails };
15657
15669
  }
15658
- function unwrapItem(body, id, operation) {
15670
+ function unwrapItem(body, id, operation, entity) {
15659
15671
  if (!isRecord2(body) || !("item" in body)) {
15660
15672
  throw new AutotaskError("Expected the item envelope { item }; got a different shape", {
15661
15673
  code: "INVALID_RESPONSE",
@@ -15671,6 +15683,7 @@ function unwrapItem(body, id, operation) {
15671
15683
  {
15672
15684
  httpStatus: 200,
15673
15685
  resourceIds: id !== void 0 ? [id] : void 0,
15686
+ ...id !== void 0 && entity !== void 0 ? { details: { idRefs: [{ entity, id }] } } : {},
15674
15687
  operation,
15675
15688
  suggestedAction: "Verify the id, or resolve the record by name first."
15676
15689
  }
@@ -15980,6 +15993,7 @@ function applyFieldsFilter(projected, filter, row) {
15980
15993
  if (filter !== void 0) {
15981
15994
  const present = new Set(projected.map((f) => f.name));
15982
15995
  row.unmatchedFields = filter.filter((n) => !present.has(n));
15996
+ row.projected = true;
15983
15997
  }
15984
15998
  row.fields = kept;
15985
15999
  row.required = kept.filter((f) => f.isRequired).map((f) => f.name);
@@ -16991,6 +17005,19 @@ function decodeFileData(body) {
16991
17005
  { code: "INVALID_RESPONSE", category: "server" }
16992
17006
  );
16993
17007
  }
17008
+ var DEPLURAL_EXCEPTIONS = {
17009
+ tag_aliase: "tag_alias"
17010
+ };
17011
+ function entityNameFromPath(resourcePath) {
17012
+ const segment = resourcePath.slice(resourcePath.lastIndexOf("/") + 1);
17013
+ const snake = segment.replace(/([A-Z])/g, (_m, c, i) => (i > 0 ? `_` : "") + c.toLowerCase()).replace(/_{2,}/g, "_");
17014
+ if (snake.endsWith("ies")) return `${snake.slice(0, -3)}y`;
17015
+ if (snake.endsWith("s")) {
17016
+ const stripped = snake.slice(0, -1);
17017
+ return DEPLURAL_EXCEPTIONS[stripped] ?? stripped;
17018
+ }
17019
+ return snake;
17020
+ }
16994
17021
  var BaseResource = class {
16995
17022
  http;
16996
17023
  config;
@@ -17000,6 +17027,10 @@ var BaseResource = class {
17000
17027
  get resourcePath() {
17001
17028
  return this.config.resourcePath;
17002
17029
  }
17030
+ /** The vendor entity this resource's ids identify (issue #116 — the `details.idRefs` label, e.g. `company`). */
17031
+ get entityName() {
17032
+ return entityNameFromPath(this.resourcePath);
17033
+ }
17003
17034
  /** Parent-scoped template (from the config); undefined for top-level resources. */
17004
17035
  get parentScopedPath() {
17005
17036
  return this.config.parentScopedPath;
@@ -17023,7 +17054,7 @@ var BaseResource = class {
17023
17054
  // ------------------------------------------------------------------
17024
17055
  // Query walk (wired to the G3 walker; cursor-follow per the pinned wire)
17025
17056
  // ------------------------------------------------------------------
17026
- /** One page fetch: page 1 POSTs the QueryModel body; later pages POST the filter to the absolute cursor. */
17057
+ /** One page fetch: page 1 POSTs the QueryModel body; later pages POST the same body (`buildQueryBody`) to the absolute cursor (issue #118). */
17027
17058
  async fetchPage(params, page, pageSize, state) {
17028
17059
  const operation = `${this.config.key}.query`;
17029
17060
  if (page === 1) {
@@ -17039,8 +17070,7 @@ var BaseResource = class {
17039
17070
  operation
17040
17071
  });
17041
17072
  }
17042
- const conditions = normalizedConditions(params.filter);
17043
- const body = { filter: conditions === void 0 ? [] : buildFilter(conditions).filter };
17073
+ const body = buildQueryBody({ ...params, maxRecords: pageSize });
17044
17074
  const res = await this.http.request({
17045
17075
  method: "POST",
17046
17076
  path: cursorToPath(this.http.baseUrl, cursor),
@@ -17093,10 +17123,12 @@ var BaseResource = class {
17093
17123
  * complete-enough result. The client never owns the walk:
17094
17124
  * - `limit` = total records (default 500, hard max 2500 — above it throws
17095
17125
  * AutotaskConfigError; it is NOT a page size). The page-1 request uses
17096
- * the internal page size min(500, limit); follow-up pages POST the
17097
- * preserved filter to the absolute cursor verbatim (the pinned wire:
17098
- * MaxRecords/IncludeFields are baked into the cursor — never changed
17099
- * mid-walk), so the walk reuses `fetchPage` (the shared cursor machinery)
17126
+ * the internal page size min(500, limit) (the `latest` mechanism sizes
17127
+ * its walk from the matching count); every follow-up page POSTs the
17128
+ * SAME QueryModel body (`buildQueryBody`: MaxRecords, IncludeFields and
17129
+ * the preserved filter) to the absolute cursor (issue #118 — the vendor
17130
+ * honours IncludeFields there and ignores MaxRecords, serving its own
17131
+ * page size), so the walk reuses `fetchPage` (the shared cursor machinery)
17100
17132
  * with a per-walk closure state (walks never share state).
17101
17133
  * - The 1000-page guard still applies as a SOFT stop: a walk that would
17102
17134
  * fetch a 1001st page stops with `hasMore: true` (never a throw — this
@@ -17507,7 +17539,7 @@ var BaseResource = class {
17507
17539
  async getGlobal(id, fresh = false) {
17508
17540
  const numeric = parseIdentifier(id, "id");
17509
17541
  const res = await this.cachedGet(`${this.resourcePath}/${numeric}`, `${this.config.key}.get`, fresh, this.config.key);
17510
- return unwrapItem(res, numeric, `${this.config.key}.get`);
17542
+ return unwrapItem(res, numeric, `${this.config.key}.get`, this.entityName);
17511
17543
  }
17512
17544
  /**
17513
17545
  * V2 merge read: a FRESH single-record GET that skips response redaction
@@ -17529,7 +17561,7 @@ var BaseResource = class {
17529
17561
  skipResponseRedaction: true,
17530
17562
  maxRetries: readOpts?.maxRetries
17531
17563
  });
17532
- return unwrapItem(res, numeric, `${this.config.key}.get`);
17564
+ return unwrapItem(res, numeric, `${this.config.key}.get`, this.entityName);
17533
17565
  }
17534
17566
  /**
17535
17567
  * Issue #34 fallback merge read: a FRESH parent-scoped single-record GET
@@ -17548,13 +17580,13 @@ var BaseResource = class {
17548
17580
  skipResponseRedaction: true,
17549
17581
  maxRetries: readOpts?.maxRetries
17550
17582
  });
17551
- return unwrapItem(res, numeric, `${this.config.key}.get`);
17583
+ return unwrapItem(res, numeric, `${this.config.key}.get`, this.entityName);
17552
17584
  }
17553
17585
  /** Parent-scoped `GET .../{parentId}/<Child>/{id}` → `{ item }` unwrapped. */
17554
17586
  async getScopedRaw(parentId, id, fresh = false) {
17555
17587
  const numeric = parseIdentifier(id, "id");
17556
17588
  const res = await this.cachedGet(this.scopedItemPath(parentId, id), `${this.config.key}.get`, fresh, this.config.key);
17557
- return unwrapItem(res, numeric, `${this.config.key}.get`);
17589
+ return unwrapItem(res, numeric, `${this.config.key}.get`, this.entityName);
17558
17590
  }
17559
17591
  /**
17560
17592
  * Attachment single-read: the vendor answers the model DIRECTLY (swagger),
@@ -17564,23 +17596,23 @@ var BaseResource = class {
17564
17596
  async getScopedModel(parentId, id, fresh = false) {
17565
17597
  const numeric = parseIdentifier(id, "id");
17566
17598
  const res = await this.cachedGet(this.scopedItemPath(parentId, id), `${this.config.key}.get`, fresh, this.config.key);
17567
- return this.unwrapModelLike(res, numeric);
17599
+ return this.unwrapModelLike(res, numeric, this.entityName);
17568
17600
  }
17569
- unwrapModelLike(body, id) {
17601
+ unwrapModelLike(body, id, entity) {
17570
17602
  if (!isRecord2(body)) {
17571
17603
  throw new AutotaskError(
17572
17604
  `Expected an attachment model (or { item } / { items }) envelope for ID ${id}; got a different shape`,
17573
- { code: "INVALID_RESPONSE", category: "server", resourceIds: [id] }
17605
+ { code: "INVALID_RESPONSE", category: "server", resourceIds: [id], details: { idRefs: [{ entity, id }] } }
17574
17606
  );
17575
17607
  }
17576
17608
  if (Object.keys(body).length === 0) {
17577
- throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id] });
17609
+ throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id], details: { idRefs: [{ entity, id }] } });
17578
17610
  }
17579
- if ("item" in body) return unwrapItem(body, id);
17611
+ if ("item" in body) return unwrapItem(body, id, void 0, entity);
17580
17612
  if (Array.isArray(body.items)) {
17581
17613
  const first = body.items[0];
17582
17614
  if (first === null || first === void 0) {
17583
- throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id] });
17615
+ throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id], details: { idRefs: [{ entity, id }] } });
17584
17616
  }
17585
17617
  return first;
17586
17618
  }
@@ -17928,7 +17960,7 @@ var BaseResource = class {
17928
17960
  if (!isRecord2(res)) {
17929
17961
  throw new AutotaskError(
17930
17962
  `Expected the deleted attachment model for ID ${numeric}; got a different shape`,
17931
- { code: "INVALID_RESPONSE", category: "server", resourceIds: [numeric] }
17963
+ { code: "INVALID_RESPONSE", category: "server", resourceIds: [numeric], details: { idRefs: [{ entity: this.entityName, id: numeric }] } }
17932
17964
  );
17933
17965
  }
17934
17966
  return res;
@@ -18319,9 +18351,9 @@ var BaseResource = class {
18319
18351
  const resource = RESOURCE_KEY_BY_PATH[entityPath];
18320
18352
  const res = await this.cachedGet(`${entityPath}/${numeric}`, `${this.config.key}.fetchRecord`, fresh, resource);
18321
18353
  if (this.config.attachmentGet) {
18322
- return this.unwrapModelLike(res, numeric);
18354
+ return this.unwrapModelLike(res, numeric, entityNameFromPath(entityPath));
18323
18355
  }
18324
- return unwrapItem(res, numeric, `${this.config.key}.fetchRecord`);
18356
+ return unwrapItem(res, numeric, `${this.config.key}.fetchRecord`, entityNameFromPath(entityPath));
18325
18357
  }
18326
18358
  /**
18327
18359
  * `getContext` part fetch: a single-record read that degrades to `null`
@@ -18428,6 +18460,7 @@ var BaseResource = class {
18428
18460
  {
18429
18461
  code: "RESOLUTION_AMBIGUOUS",
18430
18462
  resourceIds: ids,
18463
+ details: { idRefs: ids.map((cid) => ({ entity: this.entityName, id: cid })) },
18431
18464
  // issue #59 PR-B: the miss-channel pointer (the generic floor names
18432
18465
  // the resource's own search op — reachable only where searchFields
18433
18466
  // is non-empty, so the named op always exists here).
@@ -18564,7 +18597,7 @@ var BaseResource = class {
18564
18597
  const ids = matches.map((m) => m.id).filter((id) => typeof id === "number");
18565
18598
  throw new ResolutionError(
18566
18599
  `findBy${field}: "${value}" is ambiguous on ${this.config.key} (matched ${matches.length} records)`,
18567
- { code: "RESOLUTION_AMBIGUOUS", resourceIds: ids }
18600
+ { code: "RESOLUTION_AMBIGUOUS", resourceIds: ids, details: { idRefs: ids.map((cid) => ({ entity: this.entityName, id: cid })) } }
18568
18601
  );
18569
18602
  }
18570
18603
  return matches[0];
@@ -18714,6 +18747,7 @@ export {
18714
18747
  IDEMPOTENT_METHODS,
18715
18748
  buildUrl,
18716
18749
  cursorToPath,
18750
+ buildQueryBody,
18717
18751
  buildQueryRequest,
18718
18752
  runWithSignal,
18719
18753
  HttpClient,
@@ -127,13 +127,13 @@ import {
127
127
  VersionInformationResource,
128
128
  VersionResource,
129
129
  ZoneInformationResource
130
- } from "./chunk-NB254T3F.js";
130
+ } from "./chunk-HXOWEYV3.js";
131
131
  import {
132
132
  AutotaskConfigError,
133
133
  HttpClient,
134
134
  resolveConfig,
135
135
  runWithSignal
136
- } from "./chunk-U6JUHHMB.js";
136
+ } from "./chunk-VYUZZIEE.js";
137
137
 
138
138
  // src/client.ts
139
139
  var AutotaskClient = class {
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6;
2
2
 
3
- var _chunkEWMG3HHUcjs = require('./chunk-EWMG3HHU.cjs');
3
+ var _chunk5O5EPYBOcjs = require('./chunk-5O5EPYBO.cjs');
4
4
 
5
5
  // src/auth.ts
6
6
  var AUTH_HEADERS = {
@@ -171,6 +171,7 @@ var AutotaskError = class extends Error {
171
171
 
172
172
 
173
173
 
174
+ /** Legacy unlabeled id list (issue #116) — see `AutotaskErrorOptions.resourceIds`; the labeled companion rides on `details.idRefs`. */
174
175
 
175
176
 
176
177
 
@@ -376,7 +377,8 @@ function parseVendorErrors(body) {
376
377
  var DETERMINISTIC_VENDOR_500_PHRASES = [
377
378
  /exceeds maximum length/i,
378
379
  /Missing Required Field/i,
379
- /Value does not exist for the required field/i
380
+ /Value does not exist for the required field/i,
381
+ /Unable to find .+ in the .+ Entity\./i
380
382
  ];
381
383
  function isDeterministicVendor500(entries) {
382
384
  if (entries === void 0) return false;
@@ -14688,12 +14690,26 @@ function normalizeZoneBase(raw) {
14688
14690
  if (url.protocol !== "http:" && url.protocol !== "https:") return void 0;
14689
14691
  return `${url.origin}${url.pathname.replace(/\/+$/, "")}`;
14690
14692
  }
14691
- function buildQueryRequest(baseUrl, resourcePath, params) {
14692
- const queryPath = `${resourcePath}/query`;
14693
+ function buildQueryBody(params) {
14693
14694
  const conditions = normalizedConditions(params.filter);
14694
14695
  const filter = conditions === void 0 ? void 0 : buildFilter(conditions);
14695
- const includeFields = params.includeFields === void 0 ? void 0 : params.includeFields.includes("id") ? params.includeFields : [...params.includeFields, "id"];
14696
+ const includeFields = effectiveIncludeFields(params);
14697
+ const body = {};
14698
+ if (params.maxRecords !== void 0) body.MaxRecords = params.maxRecords;
14699
+ if (includeFields !== void 0) body.IncludeFields = includeFields;
14700
+ body.filter = filter === void 0 ? [] : filter.filter;
14701
+ return body;
14702
+ }
14703
+ function effectiveIncludeFields(params) {
14704
+ if (params.includeFields === void 0) return void 0;
14705
+ return params.includeFields.includes("id") ? params.includeFields : [...params.includeFields, "id"];
14706
+ }
14707
+ function buildQueryRequest(baseUrl, resourcePath, params) {
14708
+ const queryPath = `${resourcePath}/query`;
14696
14709
  if (params.via === "get") {
14710
+ const conditions = normalizedConditions(params.filter);
14711
+ const filter = conditions === void 0 ? void 0 : buildFilter(conditions);
14712
+ const includeFields = effectiveIncludeFields(params);
14697
14713
  const search = {};
14698
14714
  if (filter !== void 0) search.filter = filter.filter;
14699
14715
  if (params.maxRecords !== void 0) search.maxRecords = params.maxRecords;
@@ -14711,11 +14727,7 @@ function buildQueryRequest(baseUrl, resourcePath, params) {
14711
14727
  }
14712
14728
  return req;
14713
14729
  }
14714
- const body = {};
14715
- if (params.maxRecords !== void 0) body.MaxRecords = params.maxRecords;
14716
- if (includeFields !== void 0) body.IncludeFields = includeFields;
14717
- body.filter = filter === void 0 ? [] : filter.filter;
14718
- return { method: "POST", path: queryPath, body, idempotent: true };
14730
+ return { method: "POST", path: queryPath, body: buildQueryBody(params), idempotent: true };
14719
14731
  }
14720
14732
  var ambientSignal = new (0, _async_hooks.AsyncLocalStorage)();
14721
14733
  function runWithSignal(signal, fn) {
@@ -15655,7 +15667,7 @@ function unwrapItems(body, operation) {
15655
15667
  }
15656
15668
  return { items: body.items, pageDetails: body.pageDetails };
15657
15669
  }
15658
- function unwrapItem(body, id, operation) {
15670
+ function unwrapItem(body, id, operation, entity) {
15659
15671
  if (!isRecord2(body) || !("item" in body)) {
15660
15672
  throw new AutotaskError("Expected the item envelope { item }; got a different shape", {
15661
15673
  code: "INVALID_RESPONSE",
@@ -15671,6 +15683,7 @@ function unwrapItem(body, id, operation) {
15671
15683
  {
15672
15684
  httpStatus: 200,
15673
15685
  resourceIds: id !== void 0 ? [id] : void 0,
15686
+ ...id !== void 0 && entity !== void 0 ? { details: { idRefs: [{ entity, id }] } } : {},
15674
15687
  operation,
15675
15688
  suggestedAction: "Verify the id, or resolve the record by name first."
15676
15689
  }
@@ -15980,6 +15993,7 @@ function applyFieldsFilter(projected, filter, row) {
15980
15993
  if (filter !== void 0) {
15981
15994
  const present = new Set(projected.map((f) => f.name));
15982
15995
  row.unmatchedFields = filter.filter((n) => !present.has(n));
15996
+ row.projected = true;
15983
15997
  }
15984
15998
  row.fields = kept;
15985
15999
  row.required = kept.filter((f) => f.isRequired).map((f) => f.name);
@@ -15991,7 +16005,7 @@ function capabilitySets() {
15991
16005
  const fieldOps = /* @__PURE__ */ new Map();
15992
16006
  const udfOps = /* @__PURE__ */ new Map();
15993
16007
  const resources = /* @__PURE__ */ new Set();
15994
- for (const rec of _chunkEWMG3HHUcjs.CAPABILITIES) {
16008
+ for (const rec of _chunk5O5EPYBOcjs.CAPABILITIES) {
15995
16009
  if (rec.resource === "operations") continue;
15996
16010
  resources.add(rec.resource);
15997
16011
  if (rec.operation === "getFieldInfo") fieldOps.set(rec.resource, rec);
@@ -16991,6 +17005,19 @@ function decodeFileData(body) {
16991
17005
  { code: "INVALID_RESPONSE", category: "server" }
16992
17006
  );
16993
17007
  }
17008
+ var DEPLURAL_EXCEPTIONS = {
17009
+ tag_aliase: "tag_alias"
17010
+ };
17011
+ function entityNameFromPath(resourcePath) {
17012
+ const segment = resourcePath.slice(resourcePath.lastIndexOf("/") + 1);
17013
+ const snake = segment.replace(/([A-Z])/g, (_m, c, i) => (i > 0 ? `_` : "") + c.toLowerCase()).replace(/_{2,}/g, "_");
17014
+ if (snake.endsWith("ies")) return `${snake.slice(0, -3)}y`;
17015
+ if (snake.endsWith("s")) {
17016
+ const stripped = snake.slice(0, -1);
17017
+ return _nullishCoalesce(DEPLURAL_EXCEPTIONS[stripped], () => ( stripped));
17018
+ }
17019
+ return snake;
17020
+ }
16994
17021
  var BaseResource = class {
16995
17022
 
16996
17023
 
@@ -17000,6 +17027,10 @@ var BaseResource = class {
17000
17027
  get resourcePath() {
17001
17028
  return this.config.resourcePath;
17002
17029
  }
17030
+ /** The vendor entity this resource's ids identify (issue #116 — the `details.idRefs` label, e.g. `company`). */
17031
+ get entityName() {
17032
+ return entityNameFromPath(this.resourcePath);
17033
+ }
17003
17034
  /** Parent-scoped template (from the config); undefined for top-level resources. */
17004
17035
  get parentScopedPath() {
17005
17036
  return this.config.parentScopedPath;
@@ -17023,7 +17054,7 @@ var BaseResource = class {
17023
17054
  // ------------------------------------------------------------------
17024
17055
  // Query walk (wired to the G3 walker; cursor-follow per the pinned wire)
17025
17056
  // ------------------------------------------------------------------
17026
- /** One page fetch: page 1 POSTs the QueryModel body; later pages POST the filter to the absolute cursor. */
17057
+ /** One page fetch: page 1 POSTs the QueryModel body; later pages POST the same body (`buildQueryBody`) to the absolute cursor (issue #118). */
17027
17058
  async fetchPage(params, page, pageSize, state) {
17028
17059
  const operation = `${this.config.key}.query`;
17029
17060
  if (page === 1) {
@@ -17039,8 +17070,7 @@ var BaseResource = class {
17039
17070
  operation
17040
17071
  });
17041
17072
  }
17042
- const conditions = normalizedConditions(params.filter);
17043
- const body = { filter: conditions === void 0 ? [] : buildFilter(conditions).filter };
17073
+ const body = buildQueryBody({ ...params, maxRecords: pageSize });
17044
17074
  const res = await this.http.request({
17045
17075
  method: "POST",
17046
17076
  path: cursorToPath(this.http.baseUrl, cursor),
@@ -17093,10 +17123,12 @@ var BaseResource = class {
17093
17123
  * complete-enough result. The client never owns the walk:
17094
17124
  * - `limit` = total records (default 500, hard max 2500 — above it throws
17095
17125
  * AutotaskConfigError; it is NOT a page size). The page-1 request uses
17096
- * the internal page size min(500, limit); follow-up pages POST the
17097
- * preserved filter to the absolute cursor verbatim (the pinned wire:
17098
- * MaxRecords/IncludeFields are baked into the cursor — never changed
17099
- * mid-walk), so the walk reuses `fetchPage` (the shared cursor machinery)
17126
+ * the internal page size min(500, limit) (the `latest` mechanism sizes
17127
+ * its walk from the matching count); every follow-up page POSTs the
17128
+ * SAME QueryModel body (`buildQueryBody`: MaxRecords, IncludeFields and
17129
+ * the preserved filter) to the absolute cursor (issue #118 — the vendor
17130
+ * honours IncludeFields there and ignores MaxRecords, serving its own
17131
+ * page size), so the walk reuses `fetchPage` (the shared cursor machinery)
17100
17132
  * with a per-walk closure state (walks never share state).
17101
17133
  * - The 1000-page guard still applies as a SOFT stop: a walk that would
17102
17134
  * fetch a 1001st page stops with `hasMore: true` (never a throw — this
@@ -17507,7 +17539,7 @@ var BaseResource = class {
17507
17539
  async getGlobal(id, fresh = false) {
17508
17540
  const numeric = parseIdentifier(id, "id");
17509
17541
  const res = await this.cachedGet(`${this.resourcePath}/${numeric}`, `${this.config.key}.get`, fresh, this.config.key);
17510
- return unwrapItem(res, numeric, `${this.config.key}.get`);
17542
+ return unwrapItem(res, numeric, `${this.config.key}.get`, this.entityName);
17511
17543
  }
17512
17544
  /**
17513
17545
  * V2 merge read: a FRESH single-record GET that skips response redaction
@@ -17529,7 +17561,7 @@ var BaseResource = class {
17529
17561
  skipResponseRedaction: true,
17530
17562
  maxRetries: _optionalChain([readOpts, 'optionalAccess', _172 => _172.maxRetries])
17531
17563
  });
17532
- return unwrapItem(res, numeric, `${this.config.key}.get`);
17564
+ return unwrapItem(res, numeric, `${this.config.key}.get`, this.entityName);
17533
17565
  }
17534
17566
  /**
17535
17567
  * Issue #34 fallback merge read: a FRESH parent-scoped single-record GET
@@ -17548,13 +17580,13 @@ var BaseResource = class {
17548
17580
  skipResponseRedaction: true,
17549
17581
  maxRetries: _optionalChain([readOpts, 'optionalAccess', _173 => _173.maxRetries])
17550
17582
  });
17551
- return unwrapItem(res, numeric, `${this.config.key}.get`);
17583
+ return unwrapItem(res, numeric, `${this.config.key}.get`, this.entityName);
17552
17584
  }
17553
17585
  /** Parent-scoped `GET .../{parentId}/<Child>/{id}` → `{ item }` unwrapped. */
17554
17586
  async getScopedRaw(parentId, id, fresh = false) {
17555
17587
  const numeric = parseIdentifier(id, "id");
17556
17588
  const res = await this.cachedGet(this.scopedItemPath(parentId, id), `${this.config.key}.get`, fresh, this.config.key);
17557
- return unwrapItem(res, numeric, `${this.config.key}.get`);
17589
+ return unwrapItem(res, numeric, `${this.config.key}.get`, this.entityName);
17558
17590
  }
17559
17591
  /**
17560
17592
  * Attachment single-read: the vendor answers the model DIRECTLY (swagger),
@@ -17564,23 +17596,23 @@ var BaseResource = class {
17564
17596
  async getScopedModel(parentId, id, fresh = false) {
17565
17597
  const numeric = parseIdentifier(id, "id");
17566
17598
  const res = await this.cachedGet(this.scopedItemPath(parentId, id), `${this.config.key}.get`, fresh, this.config.key);
17567
- return this.unwrapModelLike(res, numeric);
17599
+ return this.unwrapModelLike(res, numeric, this.entityName);
17568
17600
  }
17569
- unwrapModelLike(body, id) {
17601
+ unwrapModelLike(body, id, entity) {
17570
17602
  if (!isRecord2(body)) {
17571
17603
  throw new AutotaskError(
17572
17604
  `Expected an attachment model (or { item } / { items }) envelope for ID ${id}; got a different shape`,
17573
- { code: "INVALID_RESPONSE", category: "server", resourceIds: [id] }
17605
+ { code: "INVALID_RESPONSE", category: "server", resourceIds: [id], details: { idRefs: [{ entity, id }] } }
17574
17606
  );
17575
17607
  }
17576
17608
  if (Object.keys(body).length === 0) {
17577
- throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id] });
17609
+ throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id], details: { idRefs: [{ entity, id }] } });
17578
17610
  }
17579
- if ("item" in body) return unwrapItem(body, id);
17611
+ if ("item" in body) return unwrapItem(body, id, void 0, entity);
17580
17612
  if (Array.isArray(body.items)) {
17581
17613
  const first = body.items[0];
17582
17614
  if (first === null || first === void 0) {
17583
- throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id] });
17615
+ throw new NotFoundError(`The record with ID ${id} was not found`, { httpStatus: 200, resourceIds: [id], details: { idRefs: [{ entity, id }] } });
17584
17616
  }
17585
17617
  return first;
17586
17618
  }
@@ -17928,7 +17960,7 @@ var BaseResource = class {
17928
17960
  if (!isRecord2(res)) {
17929
17961
  throw new AutotaskError(
17930
17962
  `Expected the deleted attachment model for ID ${numeric}; got a different shape`,
17931
- { code: "INVALID_RESPONSE", category: "server", resourceIds: [numeric] }
17963
+ { code: "INVALID_RESPONSE", category: "server", resourceIds: [numeric], details: { idRefs: [{ entity: this.entityName, id: numeric }] } }
17932
17964
  );
17933
17965
  }
17934
17966
  return res;
@@ -18319,9 +18351,9 @@ var BaseResource = class {
18319
18351
  const resource = RESOURCE_KEY_BY_PATH[entityPath];
18320
18352
  const res = await this.cachedGet(`${entityPath}/${numeric}`, `${this.config.key}.fetchRecord`, fresh, resource);
18321
18353
  if (this.config.attachmentGet) {
18322
- return this.unwrapModelLike(res, numeric);
18354
+ return this.unwrapModelLike(res, numeric, entityNameFromPath(entityPath));
18323
18355
  }
18324
- return unwrapItem(res, numeric, `${this.config.key}.fetchRecord`);
18356
+ return unwrapItem(res, numeric, `${this.config.key}.fetchRecord`, entityNameFromPath(entityPath));
18325
18357
  }
18326
18358
  /**
18327
18359
  * `getContext` part fetch: a single-record read that degrades to `null`
@@ -18428,6 +18460,7 @@ var BaseResource = class {
18428
18460
  {
18429
18461
  code: "RESOLUTION_AMBIGUOUS",
18430
18462
  resourceIds: ids,
18463
+ details: { idRefs: ids.map((cid) => ({ entity: this.entityName, id: cid })) },
18431
18464
  // issue #59 PR-B: the miss-channel pointer (the generic floor names
18432
18465
  // the resource's own search op — reachable only where searchFields
18433
18466
  // is non-empty, so the named op always exists here).
@@ -18564,7 +18597,7 @@ var BaseResource = class {
18564
18597
  const ids = matches.map((m) => m.id).filter((id) => typeof id === "number");
18565
18598
  throw new ResolutionError(
18566
18599
  `findBy${field}: "${value}" is ambiguous on ${this.config.key} (matched ${matches.length} records)`,
18567
- { code: "RESOLUTION_AMBIGUOUS", resourceIds: ids }
18600
+ { code: "RESOLUTION_AMBIGUOUS", resourceIds: ids, details: { idRefs: ids.map((cid) => ({ entity: this.entityName, id: cid })) } }
18568
18601
  );
18569
18602
  }
18570
18603
  return matches[0];
@@ -18759,4 +18792,5 @@ var BaseResource = class {
18759
18792
 
18760
18793
 
18761
18794
 
18762
- exports.AUTH_HEADERS = AUTH_HEADERS; exports.buildAuthHeaders = buildAuthHeaders; exports.withAuthHeaders = withAuthHeaders; exports.NoopLogger = NoopLogger; exports.REDACTED = REDACTED; exports.CREDENTIAL_HEADER_NAMES = CREDENTIAL_HEADER_NAMES; exports.isCredentialHeaderName = isCredentialHeaderName; exports.redactRecord = redactRecord; exports.SECRET_RESPONSE_FIELDS = SECRET_RESPONSE_FIELDS; exports.PERSONAL_RESPONSE_FIELDS = PERSONAL_RESPONSE_FIELDS; exports.CONFIDENTIAL_RESPONSE_FIELDS = CONFIDENTIAL_RESPONSE_FIELDS; exports.isRedactedFieldName = isRedactedFieldName; exports.redactResponseBody = redactResponseBody; exports.AutotaskError = AutotaskError; exports.AutotaskConfigError = AutotaskConfigError; exports.AutotaskNetworkError = AutotaskNetworkError; exports.AutotaskTimeoutError = AutotaskTimeoutError; exports.AutotaskAbortError = AutotaskAbortError; exports.ResponseRejectedError = ResponseRejectedError; exports.BadRequestError = BadRequestError; exports.UnauthorizedError = UnauthorizedError; exports.ForbiddenError = ForbiddenError; exports.NotFoundError = NotFoundError; exports.ConflictError = ConflictError; exports.UnprocessableEntityError = UnprocessableEntityError; exports.RateLimitError = RateLimitError; exports.ServerError = ServerError; exports.UnexpectedContentTypeError = UnexpectedContentTypeError; exports.EmptyResponseError = EmptyResponseError; exports.CircuitBreakerError = CircuitBreakerError; exports.HostPolicyDeniedError = HostPolicyDeniedError; exports.ResolutionError = ResolutionError; exports.PaginationLimitError = PaginationLimitError; exports.QueryTooLongError = QueryTooLongError; exports.parseVendorErrors = parseVendorErrors; exports.isDeterministicVendor500 = isDeterministicVendor500; exports.formatVendorDetail = formatVendorDetail; exports.CREDENTIAL_SHAPE_POINTER = CREDENTIAL_SHAPE_POINTER; exports.mergeDetails = mergeDetails; exports.errorFromStatus = errorFromStatus; exports.StaleObjectError = StaleObjectError; exports.ConfirmationRequiredError = ConfirmationRequiredError; exports.DeleteBoundaryError = DeleteBoundaryError; exports.MarkerUnsafeIdError = MarkerUnsafeIdError; exports.RecoveryTruncatedError = RecoveryTruncatedError; exports.isAutotaskError = isAutotaskError; exports.hasSurroundingQuotes = hasSurroundingQuotes; exports.credentialShapeProblem = credentialShapeProblem; exports.CREDENTIAL_ENV_LOAD_ACTION = CREDENTIAL_ENV_LOAD_ACTION; exports.MIN_PREFIX_SUMMARY_LENGTH = MIN_PREFIX_SUMMARY_LENGTH; exports.credentialValueSummary = credentialValueSummary; exports.FIELD_CACHE_KINDS = FIELD_CACHE_KINDS; exports.DEFAULT_CIRCUIT_BREAKER_WINDOW_MS = DEFAULT_CIRCUIT_BREAKER_WINDOW_MS; exports.DEFAULT_CIRCUIT_BREAKER_FAILURE_THRESHOLD = DEFAULT_CIRCUIT_BREAKER_FAILURE_THRESHOLD; exports.DEFAULT_CIRCUIT_BREAKER_OPEN_TIMEOUT_MS = DEFAULT_CIRCUIT_BREAKER_OPEN_TIMEOUT_MS; exports.DEFAULT_CIRCUIT_BREAKER_SUCCESSES_TO_CLOSE = DEFAULT_CIRCUIT_BREAKER_SUCCESSES_TO_CLOSE; exports.DEFAULT_CIRCUIT_BREAKER_MAX_ENTRIES = DEFAULT_CIRCUIT_BREAKER_MAX_ENTRIES; exports.InMemoryCircuitBreakerStore = InMemoryCircuitBreakerStore; exports.defaultCircuitBreakerStore = defaultCircuitBreakerStore; exports.resetDefaultCircuitBreakerStore = resetDefaultCircuitBreakerStore; exports.buildBreakerKey = buildBreakerKey; exports.isBreakerFailure = isBreakerFailure; exports.DEFAULT_COOLDOWN_MAX_MS = DEFAULT_COOLDOWN_MAX_MS; exports.DEFAULT_COOLDOWN_DEFAULT_MS = DEFAULT_COOLDOWN_DEFAULT_MS; exports.DEFAULT_COOLDOWN_MAX_ENTRIES = DEFAULT_COOLDOWN_MAX_ENTRIES; exports.InMemoryCooldownStore = InMemoryCooldownStore; exports.defaultCooldownStore = defaultCooldownStore; exports.resetDefaultCooldownStore = resetDefaultCooldownStore; exports.buildTenantKey = buildTenantKey; exports.cooldownDurationMs = cooldownDurationMs; exports.ZONE_CATALOG = ZONE_CATALOG; exports.ZONES = ZONES; exports.DEFAULT_ZONE = DEFAULT_ZONE; exports.AGENT_PROFILE = AGENT_PROFILE; exports.DEFAULT_PAGE_SIZE = DEFAULT_PAGE_SIZE; exports.MAX_PAGE_SIZE = MAX_PAGE_SIZE; exports.DEFAULT_TIMEOUT_MS = DEFAULT_TIMEOUT_MS; exports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES; exports.DEFAULT_MAINTENANCE_MAX_WAIT_MS = DEFAULT_MAINTENANCE_MAX_WAIT_MS; exports.DEFAULT_MAINTENANCE_POLL_MS = DEFAULT_MAINTENANCE_POLL_MS; exports.DEFAULT_MAX_CONCURRENT = DEFAULT_MAX_CONCURRENT; exports.DEFAULT_MAX_RESPONSE_BYTES = DEFAULT_MAX_RESPONSE_BYTES; exports.DEFAULT_MAX_SCAN_RECORDS = DEFAULT_MAX_SCAN_RECORDS; exports.DEFAULT_MAX_SCAN_PAGES = DEFAULT_MAX_SCAN_PAGES; exports.DEFAULT_READ_CACHE_TTL_MS = DEFAULT_READ_CACHE_TTL_MS; exports.DEFAULT_FIELD_CACHE_TTL_MS = DEFAULT_FIELD_CACHE_TTL_MS; exports.DEFAULT_RESOURCE_NAME_CACHE_TTL_MS = DEFAULT_RESOURCE_NAME_CACHE_TTL_MS; exports.zoneUrl = zoneUrl; exports.resolveBaseUrl = resolveBaseUrl; exports.resolveCredentials = resolveCredentials; exports.resolveConfig = resolveConfig; exports.isRecord = isRecord2; exports.assertRecord = assertRecord; exports.deepMergeParams = deepMergeParams; exports.isIdentifierCandidate = isIdentifierCandidate; exports.parseIdentifier = parseIdentifier; exports.flattenUdfs = flattenUdfs; exports.newCorrelationId = newCorrelationId; exports.redactAuditBody = redactAuditBody; exports.camelKey = camelKey; exports.FILTER_OPERATORS = FILTER_OPERATORS; exports.GROUPING_OPERATORS = GROUPING_OPERATORS; exports.MAX_OR_CONDITIONS = MAX_OR_CONDITIONS; exports.MAX_UDF_PER_QUERY = MAX_UDF_PER_QUERY; exports.MAX_QUERY_LENGTH = MAX_QUERY_LENGTH; exports.MAX_GET_LENGTH = MAX_GET_LENGTH; exports.MAX_FIELD_LENGTH = MAX_FIELD_LENGTH; exports.isFilterOperator = isFilterOperator; exports.serializeFilter = serializeFilter; exports.validateFilter = validateFilter; exports.buildFilter = buildFilter; exports.normalizedConditions = normalizedConditions; exports.RELATIONSHIP_ZONE = RELATIONSHIP_ZONE; exports.RELATIONSHIP_MAP = RELATIONSHIP_MAP; exports.BLIND_SURFACE_STAMPS = BLIND_SURFACE_STAMPS; exports.DELETE_BOUNDARY_NOTES = DELETE_BOUNDARY_NOTES; exports.MARKER_FIELDS = MARKER_FIELDS; exports.EMPTY_REASON_STAMPS = EMPTY_REASON_STAMPS; exports.BLIND_SURFACE_INVENTORY = BLIND_SURFACE_INVENTORY; exports.REACHABILITY_PROBE_DEFAULTS = REACHABILITY_PROBE_DEFAULTS; exports.CREATE_GUIDANCE = CREATE_GUIDANCE; exports.UNTRUSTED_FIELDS_BY_RESOURCE = UNTRUSTED_FIELDS_BY_RESOURCE; exports.IDEMPOTENT_METHODS = IDEMPOTENT_METHODS; exports.buildUrl = buildUrl; exports.cursorToPath = cursorToPath; exports.buildQueryRequest = buildQueryRequest; exports.runWithSignal = runWithSignal; exports.HttpClient = HttpClient; exports.unwrapItems = unwrapItems; exports.unwrapItem = unwrapItem; exports.unwrapQueryCount = unwrapQueryCount; exports.unwrapOperation = unwrapOperation; exports.passthrough = passthrough; exports.MAX_PAGES = MAX_PAGES; exports.clampPageSize = clampPageSize; exports.totalPagesFor = totalPagesFor; exports.paginate = paginate; exports.paginateItems = paginateItems; exports.collectAll = collectAll; exports.toArray = toArray; exports.FIELD_PRESETS = FIELD_PRESETS; exports.FIELD_PRESET_NAMES = FIELD_PRESET_NAMES; exports.resolveFieldsPreset = resolveFieldsPreset; exports.BOUNDED_QUERY_MAX_LIMIT = BOUNDED_QUERY_MAX_LIMIT; exports.truncateNoteChars = truncateNoteChars; exports.buildDryRunResult = buildDryRunResult; exports.mergePartialBody = mergePartialBody; exports.blindStampFor = blindStampFor; exports.decodeFileData = decodeFileData; exports.BaseResource = BaseResource; exports.EXPAND_RESOURCE_NAMES_MAX_IDS = EXPAND_RESOURCE_NAMES_MAX_IDS; exports.expandResourceNames = expandResourceNames; exports.WORKFLOW_RESOURCES = WORKFLOW_RESOURCES; exports.MAX_FIELD_CATALOG_WIRE = MAX_FIELD_CATALOG_WIRE; exports.FIELD_CATALOG_HONESTY_NOTE = FIELD_CATALOG_HONESTY_NOTE; exports.fieldCatalog = fieldCatalog; exports.PICKLIST_VALUE_NOT_SERVED_NOTE = PICKLIST_VALUE_NOT_SERVED_NOTE; exports.TICKET_LABEL_FIELDS = TICKET_LABEL_FIELDS; exports.createNamePlan = createNamePlan; exports.addNameSibling = addNameSibling; exports.addLabelSibling = addLabelSibling; exports.resolveCompositeNames = resolveCompositeNames; exports.MODEL_FIELD_SETS = MODEL_FIELD_SETS; exports.MODEL_DATE_FIELDS = MODEL_DATE_FIELDS; exports.FETCH_MANY_MAX_ITEMS = FETCH_MANY_MAX_ITEMS; exports.validateFetchManyItems = validateFetchManyItems; exports.fetchMany = fetchMany; exports.FETCH_BY_IDS_MAX_ITEMS = FETCH_BY_IDS_MAX_ITEMS; exports.FETCH_BY_IDS_CHUNK_SIZE = FETCH_BY_IDS_CHUNK_SIZE; exports.fetchByIds = fetchByIds;
18795
+
18796
+ exports.AUTH_HEADERS = AUTH_HEADERS; exports.buildAuthHeaders = buildAuthHeaders; exports.withAuthHeaders = withAuthHeaders; exports.NoopLogger = NoopLogger; exports.REDACTED = REDACTED; exports.CREDENTIAL_HEADER_NAMES = CREDENTIAL_HEADER_NAMES; exports.isCredentialHeaderName = isCredentialHeaderName; exports.redactRecord = redactRecord; exports.SECRET_RESPONSE_FIELDS = SECRET_RESPONSE_FIELDS; exports.PERSONAL_RESPONSE_FIELDS = PERSONAL_RESPONSE_FIELDS; exports.CONFIDENTIAL_RESPONSE_FIELDS = CONFIDENTIAL_RESPONSE_FIELDS; exports.isRedactedFieldName = isRedactedFieldName; exports.redactResponseBody = redactResponseBody; exports.AutotaskError = AutotaskError; exports.AutotaskConfigError = AutotaskConfigError; exports.AutotaskNetworkError = AutotaskNetworkError; exports.AutotaskTimeoutError = AutotaskTimeoutError; exports.AutotaskAbortError = AutotaskAbortError; exports.ResponseRejectedError = ResponseRejectedError; exports.BadRequestError = BadRequestError; exports.UnauthorizedError = UnauthorizedError; exports.ForbiddenError = ForbiddenError; exports.NotFoundError = NotFoundError; exports.ConflictError = ConflictError; exports.UnprocessableEntityError = UnprocessableEntityError; exports.RateLimitError = RateLimitError; exports.ServerError = ServerError; exports.UnexpectedContentTypeError = UnexpectedContentTypeError; exports.EmptyResponseError = EmptyResponseError; exports.CircuitBreakerError = CircuitBreakerError; exports.HostPolicyDeniedError = HostPolicyDeniedError; exports.ResolutionError = ResolutionError; exports.PaginationLimitError = PaginationLimitError; exports.QueryTooLongError = QueryTooLongError; exports.parseVendorErrors = parseVendorErrors; exports.isDeterministicVendor500 = isDeterministicVendor500; exports.formatVendorDetail = formatVendorDetail; exports.CREDENTIAL_SHAPE_POINTER = CREDENTIAL_SHAPE_POINTER; exports.mergeDetails = mergeDetails; exports.errorFromStatus = errorFromStatus; exports.StaleObjectError = StaleObjectError; exports.ConfirmationRequiredError = ConfirmationRequiredError; exports.DeleteBoundaryError = DeleteBoundaryError; exports.MarkerUnsafeIdError = MarkerUnsafeIdError; exports.RecoveryTruncatedError = RecoveryTruncatedError; exports.isAutotaskError = isAutotaskError; exports.hasSurroundingQuotes = hasSurroundingQuotes; exports.credentialShapeProblem = credentialShapeProblem; exports.CREDENTIAL_ENV_LOAD_ACTION = CREDENTIAL_ENV_LOAD_ACTION; exports.MIN_PREFIX_SUMMARY_LENGTH = MIN_PREFIX_SUMMARY_LENGTH; exports.credentialValueSummary = credentialValueSummary; exports.FIELD_CACHE_KINDS = FIELD_CACHE_KINDS; exports.DEFAULT_CIRCUIT_BREAKER_WINDOW_MS = DEFAULT_CIRCUIT_BREAKER_WINDOW_MS; exports.DEFAULT_CIRCUIT_BREAKER_FAILURE_THRESHOLD = DEFAULT_CIRCUIT_BREAKER_FAILURE_THRESHOLD; exports.DEFAULT_CIRCUIT_BREAKER_OPEN_TIMEOUT_MS = DEFAULT_CIRCUIT_BREAKER_OPEN_TIMEOUT_MS; exports.DEFAULT_CIRCUIT_BREAKER_SUCCESSES_TO_CLOSE = DEFAULT_CIRCUIT_BREAKER_SUCCESSES_TO_CLOSE; exports.DEFAULT_CIRCUIT_BREAKER_MAX_ENTRIES = DEFAULT_CIRCUIT_BREAKER_MAX_ENTRIES; exports.InMemoryCircuitBreakerStore = InMemoryCircuitBreakerStore; exports.defaultCircuitBreakerStore = defaultCircuitBreakerStore; exports.resetDefaultCircuitBreakerStore = resetDefaultCircuitBreakerStore; exports.buildBreakerKey = buildBreakerKey; exports.isBreakerFailure = isBreakerFailure; exports.DEFAULT_COOLDOWN_MAX_MS = DEFAULT_COOLDOWN_MAX_MS; exports.DEFAULT_COOLDOWN_DEFAULT_MS = DEFAULT_COOLDOWN_DEFAULT_MS; exports.DEFAULT_COOLDOWN_MAX_ENTRIES = DEFAULT_COOLDOWN_MAX_ENTRIES; exports.InMemoryCooldownStore = InMemoryCooldownStore; exports.defaultCooldownStore = defaultCooldownStore; exports.resetDefaultCooldownStore = resetDefaultCooldownStore; exports.buildTenantKey = buildTenantKey; exports.cooldownDurationMs = cooldownDurationMs; exports.ZONE_CATALOG = ZONE_CATALOG; exports.ZONES = ZONES; exports.DEFAULT_ZONE = DEFAULT_ZONE; exports.AGENT_PROFILE = AGENT_PROFILE; exports.DEFAULT_PAGE_SIZE = DEFAULT_PAGE_SIZE; exports.MAX_PAGE_SIZE = MAX_PAGE_SIZE; exports.DEFAULT_TIMEOUT_MS = DEFAULT_TIMEOUT_MS; exports.DEFAULT_MAX_RETRIES = DEFAULT_MAX_RETRIES; exports.DEFAULT_MAINTENANCE_MAX_WAIT_MS = DEFAULT_MAINTENANCE_MAX_WAIT_MS; exports.DEFAULT_MAINTENANCE_POLL_MS = DEFAULT_MAINTENANCE_POLL_MS; exports.DEFAULT_MAX_CONCURRENT = DEFAULT_MAX_CONCURRENT; exports.DEFAULT_MAX_RESPONSE_BYTES = DEFAULT_MAX_RESPONSE_BYTES; exports.DEFAULT_MAX_SCAN_RECORDS = DEFAULT_MAX_SCAN_RECORDS; exports.DEFAULT_MAX_SCAN_PAGES = DEFAULT_MAX_SCAN_PAGES; exports.DEFAULT_READ_CACHE_TTL_MS = DEFAULT_READ_CACHE_TTL_MS; exports.DEFAULT_FIELD_CACHE_TTL_MS = DEFAULT_FIELD_CACHE_TTL_MS; exports.DEFAULT_RESOURCE_NAME_CACHE_TTL_MS = DEFAULT_RESOURCE_NAME_CACHE_TTL_MS; exports.zoneUrl = zoneUrl; exports.resolveBaseUrl = resolveBaseUrl; exports.resolveCredentials = resolveCredentials; exports.resolveConfig = resolveConfig; exports.isRecord = isRecord2; exports.assertRecord = assertRecord; exports.deepMergeParams = deepMergeParams; exports.isIdentifierCandidate = isIdentifierCandidate; exports.parseIdentifier = parseIdentifier; exports.flattenUdfs = flattenUdfs; exports.newCorrelationId = newCorrelationId; exports.redactAuditBody = redactAuditBody; exports.camelKey = camelKey; exports.FILTER_OPERATORS = FILTER_OPERATORS; exports.GROUPING_OPERATORS = GROUPING_OPERATORS; exports.MAX_OR_CONDITIONS = MAX_OR_CONDITIONS; exports.MAX_UDF_PER_QUERY = MAX_UDF_PER_QUERY; exports.MAX_QUERY_LENGTH = MAX_QUERY_LENGTH; exports.MAX_GET_LENGTH = MAX_GET_LENGTH; exports.MAX_FIELD_LENGTH = MAX_FIELD_LENGTH; exports.isFilterOperator = isFilterOperator; exports.serializeFilter = serializeFilter; exports.validateFilter = validateFilter; exports.buildFilter = buildFilter; exports.normalizedConditions = normalizedConditions; exports.RELATIONSHIP_ZONE = RELATIONSHIP_ZONE; exports.RELATIONSHIP_MAP = RELATIONSHIP_MAP; exports.BLIND_SURFACE_STAMPS = BLIND_SURFACE_STAMPS; exports.DELETE_BOUNDARY_NOTES = DELETE_BOUNDARY_NOTES; exports.MARKER_FIELDS = MARKER_FIELDS; exports.EMPTY_REASON_STAMPS = EMPTY_REASON_STAMPS; exports.BLIND_SURFACE_INVENTORY = BLIND_SURFACE_INVENTORY; exports.REACHABILITY_PROBE_DEFAULTS = REACHABILITY_PROBE_DEFAULTS; exports.CREATE_GUIDANCE = CREATE_GUIDANCE; exports.UNTRUSTED_FIELDS_BY_RESOURCE = UNTRUSTED_FIELDS_BY_RESOURCE; exports.IDEMPOTENT_METHODS = IDEMPOTENT_METHODS; exports.buildUrl = buildUrl; exports.cursorToPath = cursorToPath; exports.buildQueryBody = buildQueryBody; exports.buildQueryRequest = buildQueryRequest; exports.runWithSignal = runWithSignal; exports.HttpClient = HttpClient; exports.unwrapItems = unwrapItems; exports.unwrapItem = unwrapItem; exports.unwrapQueryCount = unwrapQueryCount; exports.unwrapOperation = unwrapOperation; exports.passthrough = passthrough; exports.MAX_PAGES = MAX_PAGES; exports.clampPageSize = clampPageSize; exports.totalPagesFor = totalPagesFor; exports.paginate = paginate; exports.paginateItems = paginateItems; exports.collectAll = collectAll; exports.toArray = toArray; exports.FIELD_PRESETS = FIELD_PRESETS; exports.FIELD_PRESET_NAMES = FIELD_PRESET_NAMES; exports.resolveFieldsPreset = resolveFieldsPreset; exports.BOUNDED_QUERY_MAX_LIMIT = BOUNDED_QUERY_MAX_LIMIT; exports.truncateNoteChars = truncateNoteChars; exports.buildDryRunResult = buildDryRunResult; exports.mergePartialBody = mergePartialBody; exports.blindStampFor = blindStampFor; exports.decodeFileData = decodeFileData; exports.BaseResource = BaseResource; exports.EXPAND_RESOURCE_NAMES_MAX_IDS = EXPAND_RESOURCE_NAMES_MAX_IDS; exports.expandResourceNames = expandResourceNames; exports.WORKFLOW_RESOURCES = WORKFLOW_RESOURCES; exports.MAX_FIELD_CATALOG_WIRE = MAX_FIELD_CATALOG_WIRE; exports.FIELD_CATALOG_HONESTY_NOTE = FIELD_CATALOG_HONESTY_NOTE; exports.fieldCatalog = fieldCatalog; exports.PICKLIST_VALUE_NOT_SERVED_NOTE = PICKLIST_VALUE_NOT_SERVED_NOTE; exports.TICKET_LABEL_FIELDS = TICKET_LABEL_FIELDS; exports.createNamePlan = createNamePlan; exports.addNameSibling = addNameSibling; exports.addLabelSibling = addLabelSibling; exports.resolveCompositeNames = resolveCompositeNames; exports.MODEL_FIELD_SETS = MODEL_FIELD_SETS; exports.MODEL_DATE_FIELDS = MODEL_DATE_FIELDS; exports.FETCH_MANY_MAX_ITEMS = FETCH_MANY_MAX_ITEMS; exports.validateFetchManyItems = validateFetchManyItems; exports.fetchMany = fetchMany; exports.FETCH_BY_IDS_MAX_ITEMS = FETCH_BY_IDS_MAX_ITEMS; exports.FETCH_BY_IDS_CHUNK_SIZE = FETCH_BY_IDS_CHUNK_SIZE; exports.fetchByIds = fetchByIds;