node-autotask 0.31.0 → 0.33.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 (38) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/MCP_TOOL_CATALOG.json +31 -12
  3. package/MCP_TOOL_MANIFEST.md +18 -19
  4. package/MCP_TOOL_OVERRIDES.json +0 -12
  5. package/N8N_MCP_MANIFEST.json +44 -18
  6. package/N8N_MCP_MANIFEST.md +15 -14
  7. package/README.md +8 -6
  8. package/capabilities.json +1579 -1414
  9. package/dist/capabilities.cjs +2 -2
  10. package/dist/capabilities.js +1 -1
  11. package/dist/{chunk-3H3RJ4LA.cjs → chunk-3LAZZT7V.cjs} +143 -143
  12. package/dist/{chunk-PCLL536B.cjs → chunk-4QN43TRP.cjs} +75 -50
  13. package/dist/{chunk-6UA544OR.js → chunk-5DS6F6GF.js} +299 -113
  14. package/dist/{chunk-RQZUV74N.js → chunk-7WNE5MPG.js} +2 -2
  15. package/dist/{chunk-INSFDXHP.js → chunk-MFDQHFGJ.js} +28 -3
  16. package/dist/{chunk-DQLEVKZS.cjs → chunk-OO67MRHN.cjs} +814 -628
  17. package/dist/{chunk-QXUN2VCJ.cjs → chunk-SP2SJJZX.cjs} +1578 -1413
  18. package/dist/{chunk-EPOHRNSX.js → chunk-VKE56TTN.js} +1578 -1413
  19. package/dist/{index-Uqj987EE.d.ts → index-BaeMHZPk.d.ts} +149 -12
  20. package/dist/{index--5jrRl4u.d.cts → index-Cq0VsfSz.d.cts} +149 -12
  21. package/dist/index.cjs +22 -22
  22. package/dist/index.d.cts +2 -2
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +4 -4
  25. package/dist/operations/index.cjs +120 -133
  26. package/dist/operations/index.d.cts +2 -2
  27. package/dist/operations/index.d.ts +2 -2
  28. package/dist/operations/index.js +3 -16
  29. package/dist/pool.cjs +9 -9
  30. package/dist/pool.d.cts +1 -1
  31. package/dist/pool.d.ts +1 -1
  32. package/dist/pool.js +4 -4
  33. package/dist/resources/index.cjs +4 -4
  34. package/dist/resources/index.d.cts +1 -1
  35. package/dist/resources/index.d.ts +1 -1
  36. package/dist/resources/index.js +3 -3
  37. package/docs/API.md +62 -37
  38. package/package.json +2 -1
@@ -135,13 +135,13 @@ import {
135
135
  VersionInformationResource,
136
136
  VersionResource,
137
137
  ZoneInformationResource
138
- } from "./chunk-6UA544OR.js";
138
+ } from "./chunk-5DS6F6GF.js";
139
139
  import {
140
140
  AutotaskConfigError,
141
141
  HttpClient,
142
142
  resolveConfig,
143
143
  runWithSignal
144
- } from "./chunk-INSFDXHP.js";
144
+ } from "./chunk-MFDQHFGJ.js";
145
145
 
146
146
  // src/client.ts
147
147
  var AutotaskClient = class {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CAPABILITIES
3
- } from "./chunk-EPOHRNSX.js";
3
+ } from "./chunk-VKE56TTN.js";
4
4
 
5
5
  // src/auth.ts
6
6
  var AUTH_HEADERS = {
@@ -10863,8 +10863,8 @@ var EMPTY_REASON_STAMPS = {
10863
10863
  var POINTER_NOTES = {
10864
10864
  "ticket_history.query": `W1 (ww29 (australia-nz) live 2026-10-04; vendor contract change live-verified 2026-10-06): the vendor requires ticket_history.query to be supplied with exactly ONE ticketID-equals filter \u2014 an unfiltered call 500s by contract (10-06 text: "When querying the TicketHistory entity you are required to supply one and only one ticketID equals filter"). WITH the filter the query WORKS (live 2026-10-06: rows returned, hasMore true \u2014 a single {op:'eq', field:'ticketID', value:<id>} condition; the filter vocabulary is eq/noteq/gt/gte/lt/lte/beginsWith/endsWith/contains/exist/notExist/in/notIn/and/or). tickets.timeline / tickets.fullContext remain the convenient composites; raw history rows come from the filtered query.`,
10865
10865
  "time_entries.create": `W-A3 (ww29 (australia-nz) live 2026-10-04; re-walled 2026-10-06; scope re-stamped 2026-10-21): for a time_entries.create whose (resourceID, roleID) pair selects the API-only user's own resource, the vendor refused with "API-only user cannot be selected for this field" (10-04 text: "The specified AssignedResourceID and AssignedRoleID combination is not currently defined"). This is a (resource, role) pair wall, NOT a blanket refusal of time-entry writes: live time_entries.create calls succeeded on 2026-10-21 (pair not recorded; two entries created, read back, 1.0 h total). The authorised pair set has NOT been re-adjudicated by a live probe; if a create fails with the pair-validation text, check the resource's role authorisation (whoAmI / the resource record) and try another pair. createForResource's 10-06 wall is likewise unconfirmed for other pairs. Working reads remain postedWithin / the window helpers (W-D3 pointer note).`,
10866
- "time_entries.getPosted": "W-D3 (ww29 (australia-nz) live 2026-10-04, re-verified live 2026-10-15): this zone's TimeEntry entity exposes NO posted-state filter field \u2014 the vendor rejects postingStatus, postedDate and status with \"Unable to find X in the TimeEntry Entity\" (live field-existence oracle 2026-10-04: only dateWorked / resourceID / ticketID / taskID resolve as filter fields). Re-probed 2026-10-15 (ww29 re-probe campaign): time_entries.getPosted live 500, vendor body verbatim 'Unable to find postedDate in the TimeEntry Entity.' \u2014 a vendor endpoint defect on AU03, not a transient fault: posted cannot be filtered server-side on this zone \u2014 use time_entries.postedWithin (the dateWorked window, live-verified working \u2014 omit the `posted` narrowing on this zone: it sends postedDate, which the zone 500s) or read time_entries.query and derive posted-state from the fields your zone's entity exposes",
10867
- "time_entries.getUnposted": "W-D3 (ww29 (australia-nz) live 2026-10-04, re-verified live 2026-10-15): this zone's TimeEntry entity exposes NO posted-state filter field \u2014 the vendor rejects postingStatus, postedDate and status with \"Unable to find X in the TimeEntry Entity\" (live field-existence oracle 2026-10-04: only dateWorked / resourceID / ticketID / taskID resolve as filter fields). Re-probed 2026-10-15 (ww29 re-probe campaign): time_entries.getUnposted live 500, vendor body verbatim 'Unable to find postedDate in the TimeEntry Entity.' \u2014 a vendor endpoint defect on AU03, not a transient fault: unposted cannot be filtered server-side on this zone \u2014 use time_entries.postedWithin (the dateWorked window, live-verified working \u2014 omit the `posted` narrowing on this zone: it sends postedDate, which the zone 500s) or read time_entries.query and derive posted-state from the fields your zone's entity exposes",
10866
+ "time_entries.getPosted": `W-D3 (ww29 (australia-nz) live 2026-10-04, re-verified live 2026-10-27): this zone's TimeEntry entity exposes NO posted-state field \u2014 reads carry no postedDate/postedOnTime and a postedDate exist/notExist filter fails with SERVER_ERROR "Unable to find postedDate in the TimeEntry Entity". time_entries.getPosted therefore no longer sends any postedDate condition: posted state is derived from billing_items.timeEntryID (an entry is posted when a billing item references it, whether or not billingApprovalDateTime is set \u2014 ww29 never populates it). If a call still fails, the fault is NOT the old postedDate wall: it is a billing_items join/read fault (typed error \u2014 429 RATE_LIMITED included \u2014 propagates, no partial result). The dateWorked window reads time_entries.postedWithin / time_entries.dateWorkedWindow use the same derivation.`,
10867
+ "time_entries.getUnposted": `W-D3 (ww29 (australia-nz) live 2026-10-04, re-verified live 2026-10-27): this zone's TimeEntry entity exposes NO posted-state field \u2014 reads carry no postedDate/postedOnTime and a postedDate exist/notExist filter fails with SERVER_ERROR "Unable to find postedDate in the TimeEntry Entity". time_entries.getUnposted therefore no longer sends any postedDate condition: unposted state is derived from billing_items.timeEntryID (an entry is posted when a billing item references it, whether or not billingApprovalDateTime is set \u2014 ww29 never populates it). If a call still fails, the fault is NOT the old postedDate wall: it is a billing_items join/read fault (typed error \u2014 429 RATE_LIMITED included \u2014 propagates, no partial result). The dateWorked window reads time_entries.postedWithin / time_entries.dateWorkedWindow use the same derivation.`,
10868
10868
  "authenticate.get": "W2: authenticate.get is DESIGNATOR-ONLY \u2014 it returns the designator identity, not a tenant data surface; a miss/empty here is not a data-empty signal (no emptyReason is attached by design \u2014 a false reason would be worse than none)"
10869
10869
  };
10870
10870
  var BLIND_SURFACE_INVENTORY = {
@@ -16791,6 +16791,20 @@ var HttpClient = class {
16791
16791
  }
16792
16792
  };
16793
16793
 
16794
+ // src/operations/requiredFields.ts
16795
+ function effectiveRequiredFields(record, zoneFacts) {
16796
+ const prefix = zoneFacts?.createGuidance?.liveProvenPrefix;
16797
+ if (Array.isArray(prefix) && prefix.length > 0) {
16798
+ return { fields: [...prefix], from: "live-proven" };
16799
+ }
16800
+ const zoneSet = zoneFacts?.createRequiredSet;
16801
+ if (Array.isArray(zoneSet) && zoneSet.length > 0) {
16802
+ return { fields: [...zoneSet], from: "zone" };
16803
+ }
16804
+ const spec = record?.requiredFields;
16805
+ return { fields: Array.isArray(spec) ? [...spec] : [], from: "spec" };
16806
+ }
16807
+
16794
16808
  // src/pagination.ts
16795
16809
  var MAX_PAGES = 1e3;
16796
16810
  function clampPageSize(pageSize) {
@@ -20005,6 +20019,16 @@ var MutationBase = class extends MetaBase {
20005
20019
  warnings.push(`parent ${parentId} not found; the vendor would reject the create`);
20006
20020
  }
20007
20021
  }
20022
+ if (isRecord2(data)) {
20023
+ const eff = effectiveRequiredFields(void 0, RELATIONSHIP_MAP[this.config.key]?.zoneFacts ?? null);
20024
+ const missing = eff.fields.filter((f) => f !== this.config.parentField && data[f] === void 0);
20025
+ if (missing.length > 0) {
20026
+ warnings.push(`required field(s) not in the data: ${missing.join(", ")} (${eff.from}); the vendor would likely reject the create`);
20027
+ }
20028
+ }
20029
+ if (this.config.key === "companies") {
20030
+ warnings.push('the vendor auto-creates a "Primary Address" location for a new company (rename it with company_locations.update; it cannot be deleted via the API)');
20031
+ }
20008
20032
  return buildDryRunResult({
20009
20033
  operation: `${this.config.key}.create`,
20010
20034
  method: "POST",
@@ -20400,6 +20424,7 @@ export {
20400
20424
  mergePartialBody,
20401
20425
  blindStampFor,
20402
20426
  decodeFileData,
20427
+ effectiveRequiredFields,
20403
20428
  MAX_PAGES,
20404
20429
  clampPageSize,
20405
20430
  totalPagesFor,