node-autotask 0.26.0 → 0.28.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 (49) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/MCP_TOOL_CATALOG.json +941 -14
  3. package/MCP_TOOL_MANIFEST.md +71 -16
  4. package/N8N_MCP_MANIFEST.json +91 -10
  5. package/N8N_MCP_MANIFEST.md +14 -11
  6. package/README.md +11 -9
  7. package/capabilities.json +13623 -7738
  8. package/capabilities.schema.json +125 -0
  9. package/dist/capabilities.cjs +2 -2
  10. package/dist/capabilities.js +1 -1
  11. package/dist/{chunk-QXWIQ67O.js → chunk-6EQSXYRW.js} +13622 -7737
  12. package/dist/{chunk-HQGE4WAV.cjs → chunk-D5IVS6GY.cjs} +1054 -235
  13. package/dist/{chunk-5OGJTS2E.cjs → chunk-GUY2KK7U.cjs} +157 -136
  14. package/dist/{chunk-SSUECUVN.js → chunk-IRVZGW5K.js} +947 -128
  15. package/dist/{chunk-7DOSJS6S.js → chunk-O2D7KDDD.js} +23 -2
  16. package/dist/{chunk-VVQ6NJYZ.js → chunk-SYX6EWMT.js} +694 -76
  17. package/dist/{chunk-SG4LIVMG.cjs → chunk-WYKGD5UD.cjs} +1189 -571
  18. package/dist/{chunk-WM6E5O55.cjs → chunk-ZEGMVEF3.cjs} +13622 -7737
  19. package/dist/{index-CKYr0unq.d.cts → index-CORcZUNm.d.cts} +457 -50
  20. package/dist/{index-1zBdJIEy.d.cts → index-DQ9NgraW.d.cts} +281 -1
  21. package/dist/{index-1zBdJIEy.d.ts → index-DQ9NgraW.d.ts} +281 -1
  22. package/dist/{index-C8QH3BkP.d.ts → index-DXuV04zM.d.ts} +457 -50
  23. package/dist/index.cjs +44 -24
  24. package/dist/index.d.cts +11 -5
  25. package/dist/index.d.ts +11 -5
  26. package/dist/index.js +26 -6
  27. package/dist/operations/index.cjs +147 -120
  28. package/dist/operations/index.d.cts +136 -7
  29. package/dist/operations/index.d.ts +136 -7
  30. package/dist/operations/index.js +33 -6
  31. package/dist/pool.cjs +42 -9
  32. package/dist/pool.d.cts +14 -3
  33. package/dist/pool.d.ts +14 -3
  34. package/dist/pool.js +38 -5
  35. package/dist/resources/index.cjs +19 -5
  36. package/dist/resources/index.d.cts +2 -2
  37. package/dist/resources/index.d.ts +2 -2
  38. package/dist/resources/index.js +18 -4
  39. package/dist/types/index.cjs +1 -1
  40. package/dist/types/index.d.cts +1 -1
  41. package/dist/types/index.d.ts +1 -1
  42. package/dist/types/index.js +1 -1
  43. package/docs/API.md +246 -10
  44. package/examples/mcp/schemas.ts +16 -7
  45. package/package.json +1 -1
  46. /package/dist/{chunk-S643FDOR.cjs → chunk-IXF7AKOJ.cjs} +0 -0
  47. /package/dist/{chunk-2TWKEB2L.js → chunk-RMG55JTF.js} +0 -0
  48. /package/dist/{chunk-W3K5BEVY.cjs → chunk-SDYRQFGL.cjs} +0 -0
  49. /package/dist/{chunk-EBCHCNPK.js → chunk-WLTLB2ND.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,89 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.28.0] - 2026-10-26
11
+
12
+ Minor: two new operations and one plan-recorded fact. The plan hash moves `7318bd56…` -> `ebbd6f31…`, so a consumer
13
+ re-pins once. The pending 0.27.1 schema-text fix rides in this release (0.27.1 was never published).
14
+
15
+ ### Added
16
+
17
+ - **`tickets.forResource(resourceID, opts?)` (#225)** — the tickets one resource is on, as primary assignee, secondary
18
+ resource, or both (`scope`, default `both`), de-duplicated, with `primaryIds` / `secondaryIds` / `bothIds`,
19
+ `counts: { primary, secondary, both, open }`, `capped`, `unresolvedIds` and the `closedStatus` disclosure.
20
+ The vendor exposes no such join: `Tickets.assignedResourceID` is the primary owner only and `TicketSecondaryResources`
21
+ is a five-field link table with no status. Two bounded reads plus chunked `id in` (100 per read) do the join
22
+ client-side, the `time_entries.recentTickets` way — **not** the grouped cross-field `or`, whose live vendor semantics
23
+ are unverified.
24
+ - **`tickets.statusSemantics(opts?)` (#226)** — resolves which status ids mean closed in *this* tenant from the live
25
+ `Tickets` status picklist (through the field-metadata cache, so a warm catalog is zero wire) and reports
26
+ `{ picklist, closedIds, source: 'picklist' | 'assumed', note }`. `excludeStatusIds` lets a caller decide.
27
+
28
+ ### Changed
29
+
30
+ - **No module-level ticket-status literal remains.** `TICKET_COMPLETE_STATUS = 5` is gone from `move-engine.ts`; the
31
+ `MOVE_TARGET_CLOSED` refusal and `companies.fullProfile`'s `openTickets` part both consume the resolved set and carry
32
+ the disclosure (`closedStatusIds` / `closedStatusSource`, or the part `note`). When the picklist cannot be read, id 5
33
+ still stands in — but `source: 'assumed'` and the note say so in the output.
34
+
35
+ ### Fixed
36
+
37
+ - **`time_entries.approve` described its `id` as "the time-off request id".** The special-op argument map is keyed by
38
+ verb, and `time_off_requests.approve` owns `approve`; a new `SPECIAL_OP_ARG_RESOURCE_OVERRIDES` map (the special-op
39
+ mirror of the per-resource window override) re-keys a shared verb by resource and wins wholesale over the shared entry.
40
+
41
+ ### Known
42
+
43
+ - 28 helpers still declare `outputSchema: { type: 'void' }` while returning values; fixing that needs its own plan move
44
+ (issue #224).
45
+
46
+ ## [0.27.0] - 2026-10-26
47
+
48
+ Matched release with iit-mcp-autotask 0.27.0. The plan hash moves `930b907e…` -> `7318bd56…`, so this is a minor
49
+ bump. Three batches were batched into one release deliberately: every plan edit costs a consumer one re-pin, one
50
+ `BUILT_AGAINST_PLAN_HASH` re-stamp and one catalog rebuild, so they share a single hash move.
51
+
52
+ ### Added
53
+
54
+ - **Time-entry approval (#221).** `billing_item_approval_levels` (`create`, `query`, `queryAll`, `count`, `get`) —
55
+ the only REST approval write the vendor exposes — plus `timeEntries.approve(id, opts)`, which runs the documented
56
+ two-step in one call (create the approval level, then update the entry's `billingApprovalDateTime` /
57
+ `billingApprovalResourceID`) and reports `status: 'approved' | 'approval_fields_not_persisted'` with the resulting
58
+ `billingApprovalLevelMostRecent`. Non-persistence is a result, not an error: the approval-level row is the durable
59
+ half and has no DELETE. **Posting is not here and cannot be**: `BillingItems` has no create.
60
+ - **Six reference-target resources (#220).** `tax_regions`, `invoice_templates`, `sales_orders`,
61
+ `organizational_level_associations`, `organizational_level1s`, `organizational_level2s`. Vendor asymmetries kept:
62
+ `invoice_templates` is read-only; `sales_orders` has no create; none of the six has a DELETE.
63
+ - **`referenceTargets` plan block (#219 N5).** Eight association-FK targets: four funded by the resources above, four
64
+ declared `resource: null` / `exposedByVendor: false` with the remedy the caller should follow. Clause 19 validates
65
+ the block.
66
+ - **`targetResource` / `targetEnumerable` on field rows (#219 N1).** Derived from the relationship map's `apiEntity`,
67
+ so `contacts.companyLocationID -> "company_locations"` and `tickets.queueID -> null / false`. A size-pinned test
68
+ fails when a plan resource is added that the map does not cover.
69
+ - **`effectiveRequiredFields()` (#219 N4).** One precedence — live-proven prefix > `createRequiredSet` > vendor
70
+ `isRequired` — with the winning source named on the result.
71
+ - **UDF surface (#219 N7).** `udf-marker` as the filter mechanism (the vendor's `isQueryable` is wrong for UDFs),
72
+ `writeShape` on object/array fields (`userDefinedFields: merge`), and UDF definitions with labels and picklist
73
+ values on the existing `udf` include.
74
+ - **Structured create requirements (#219 N3).** `blocker.requires {anyOf|allOf|noneOf}`, `createGuidance.requiresByValue`
75
+ and `rejectedValues`. `ticket_charges.create` and `project_charges.create` declare
76
+ `anyOf: ["productID","billingCodeID"]`; `contracts.create` declares its per-type requirement ladder. Clause 20 fails
77
+ when a row's evidence states a one-of requirement the row does not declare.
78
+ - **Declared derived fields (#219 N8).** `resources.time_entries.derivedFields` with token rules
79
+ (`elapsed(...)`, `parent`, `mirror(...)`, `external` + `writableRoute`), served on the record metadata, on
80
+ `fieldCatalog` rows and in the create guidance. Clause 21 keeps the artifact token-only.
81
+
82
+ ### Changed
83
+
84
+ - **Pooled clients share one read cache (#219 N6).** `ClientPoolOptions.sharedReadCache` defaults to `true`, so a
85
+ read-back routed to another pooled client cannot be served a pre-write snapshot. `sharedReadCache: false` restores
86
+ the per-client caches.
87
+ - **Cross-resource tool schemas carry `x-untrusted: ["*"]`.** The five wildcard tools previously inlined the union of
88
+ every resource's untrusted fields, so the served `tools/list` grew with the catalog and had reached 99.6% of the
89
+ 10,000-token budget. `["*"]` states the stronger claim and leaves the per-resource lists as the authority; core
90
+ payload 43,107 B -> 34,467 B.
91
+
92
+
10
93
  ## [0.26.0] - Unreleased
11
94
 
12
95
  Matched release with iit-mcp-autotask 0.26.0.