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.
- package/ARCHITECTURE.md +10 -4
- package/MCP_TOOL_CATALOG.json +2 -2
- package/MCP_TOOL_MANIFEST.md +4 -4
- package/N8N_MCP_MANIFEST.json +2 -2
- package/N8N_MCP_MANIFEST.md +3 -3
- package/README.md +36 -0
- package/capabilities.json +1571 -1571
- package/dist/capabilities.cjs +2 -2
- package/dist/capabilities.js +1 -1
- package/dist/{chunk-EWMG3HHU.cjs → chunk-5O5EPYBO.cjs} +1570 -1570
- package/dist/{chunk-L3TK4CN5.cjs → chunk-7I3F3AJJ.cjs} +429 -419
- package/dist/{chunk-VCGC6YCI.cjs → chunk-G564CHXM.cjs} +135 -135
- package/dist/{chunk-NB254T3F.js → chunk-HXOWEYV3.js} +49 -39
- package/dist/{chunk-JIDR3NPV.js → chunk-VV2UUW2J.js} +1570 -1570
- package/dist/{chunk-U6JUHHMB.js → chunk-VYUZZIEE.js} +66 -32
- package/dist/{chunk-GWALLMAM.js → chunk-W2WSZOZA.js} +2 -2
- package/dist/{chunk-MAYYTYV5.cjs → chunk-WRWX6WIK.cjs} +68 -34
- package/dist/{index-CUsvZndu.d.ts → index-BqPY04ZG.d.ts} +89 -16
- package/dist/{index-leMyBJze.d.cts → index-D7x3MkLK.d.cts} +89 -16
- package/dist/index.cjs +24 -22
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +6 -4
- package/dist/operations/index.cjs +178 -105
- package/dist/operations/index.d.cts +22 -7
- package/dist/operations/index.d.ts +22 -7
- package/dist/operations/index.js +77 -4
- package/dist/pool.cjs +8 -8
- package/dist/pool.d.cts +1 -1
- package/dist/pool.d.ts +1 -1
- package/dist/pool.js +4 -4
- package/dist/resources/index.cjs +4 -4
- package/dist/resources/index.d.cts +1 -1
- package/dist/resources/index.d.ts +1 -1
- package/dist/resources/index.js +3 -3
- package/docs/API.md +78 -15
- package/examples/basic.ts +2 -2
- package/examples/mcp-server-http.ts +5 -4
- package/examples/mcp-server.ts +3 -3
- package/package.json +3 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CAPABILITIES
|
|
3
|
-
} from "./chunk-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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)
|
|
17097
|
-
*
|
|
17098
|
-
*
|
|
17099
|
-
*
|
|
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-
|
|
130
|
+
} from "./chunk-HXOWEYV3.js";
|
|
131
131
|
import {
|
|
132
132
|
AutotaskConfigError,
|
|
133
133
|
HttpClient,
|
|
134
134
|
resolveConfig,
|
|
135
135
|
runWithSignal
|
|
136
|
-
} from "./chunk-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
17097
|
-
*
|
|
17098
|
-
*
|
|
17099
|
-
*
|
|
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
|
-
|
|
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;
|