node-autotask 0.33.0 → 0.34.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 (39) hide show
  1. package/CHANGELOG.md +32 -0
  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/capabilities.json +4084 -2544
  7. package/capabilities.schema.json +32 -0
  8. package/dist/capabilities.cjs +2 -2
  9. package/dist/capabilities.d.cts +13 -1
  10. package/dist/capabilities.d.ts +13 -1
  11. package/dist/capabilities.js +1 -1
  12. package/dist/{chunk-VKE56TTN.js → chunk-4MUBUSTL.js} +4083 -2543
  13. package/dist/{chunk-5DS6F6GF.js → chunk-6ADFCU3I.js} +399 -342
  14. package/dist/{chunk-OO67MRHN.cjs → chunk-DKJP73FX.cjs} +966 -909
  15. package/dist/{chunk-MFDQHFGJ.js → chunk-EZKM4HQ6.js} +1017 -577
  16. package/dist/{chunk-SP2SJJZX.cjs → chunk-FOOHJBPP.cjs} +4083 -2543
  17. package/dist/{chunk-4QN43TRP.cjs → chunk-GDQ4QM7Q.cjs} +1066 -626
  18. package/dist/{chunk-3LAZZT7V.cjs → chunk-P6YN2POI.cjs} +143 -143
  19. package/dist/{chunk-7WNE5MPG.js → chunk-RDFL5QYE.js} +2 -2
  20. package/dist/{index-BaeMHZPk.d.ts → index-ByMU8IC2.d.ts} +498 -198
  21. package/dist/{index-Cq0VsfSz.d.cts → index-Dx4-zpDo.d.cts} +498 -198
  22. package/dist/index.cjs +23 -23
  23. package/dist/index.d.cts +2 -2
  24. package/dist/index.d.ts +2 -2
  25. package/dist/index.js +5 -5
  26. package/dist/operations/index.cjs +157 -116
  27. package/dist/operations/index.d.cts +39 -25
  28. package/dist/operations/index.d.ts +39 -25
  29. package/dist/operations/index.js +47 -6
  30. package/dist/pool.cjs +9 -9
  31. package/dist/pool.d.cts +1 -1
  32. package/dist/pool.d.ts +1 -1
  33. package/dist/pool.js +4 -4
  34. package/dist/resources/index.cjs +4 -4
  35. package/dist/resources/index.d.cts +1 -1
  36. package/dist/resources/index.d.ts +1 -1
  37. package/dist/resources/index.js +3 -3
  38. package/docs/API.md +160 -35
  39. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ Minor: the plan hash moves `913f1120...` -> `08cf890f...` (new `caveats` channel, `createGuidance` data hygiene, `opts` on every `get` input schema), so the next release is 0.34.0 and a consumer re-pins once.
11
+
12
+ ### Added
13
+
14
+ - **#244: `allowAssumed?: boolean` on `tickets.statusSemantics`, `tickets.forResource` and `companies.fullProfile`** (default `true`, behaviour unchanged). With `false`, an unreadable status picklist or one with no closed label throws `AutotaskError` code `STATUS_SEMANTICS_UNRESOLVED` instead of falling back to the assumed `[5]`. `companies.fullProfile` also takes `excludeStatusIds`, so an operator pin reaches every open-ticket consumer.
15
+ - **#248: `tickets.forResource({ countOnly: true })`** returns `{ resourceID, scope, primary, secondary, both, open, capped, closedStatus }` with no ticket rows (typed overload). Primary goes through the same count path as `tickets.count`; secondary is a de-duplicated ids-only read. No new registry op.
16
+ - **#249: per-operation `caveats` channel** on operation metadata: `{ kind, fields?, remedyOp?, note }`, closed kind set (`not-persisted`), unknown kinds fail at build time. `time_entries.update` and `ticket_charges.update` serve "ticketID does NOT persist" as data. `pointerNote` and `metadata.usage` are unchanged.
17
+ - **#250: `fresh: true` on every `<resource>.get(id, { fresh })` and on `invokeRead`** bypasses the read-cache lookup and refreshes the entry. `invokeRead` honours it only on `<resource>.get` and refuses it elsewhere before any request. Every `get` input schema gains the optional `opts` argument.
18
+ - **#246: `blocker.unsatisfiableViaApi`** (attachments, opportunities), **`row.parentCompany`** (`{ via, resource, field }`, derived by a one-hop rule; 32 rows, `tasks` via `projectID`), **`referenceField`** on the five contract rows, and **`effectiveRequiredFields().unproven` / `.conditional`**.
19
+
20
+ ### Fixed
21
+
22
+ - **#245: `tickets.forResource` `capped` is exact** (limit + 1 / next-page check), and closed secondary tickets under `openOnly` are no longer listed in `unresolvedIds` (one extra unfiltered `id in` read per chunk, only when ids are missing under `openOnly`). Docs now say results sort ascending by id.
23
+
24
+ ### Changed
25
+
26
+ - **#246: `createGuidance` blocker `message` / `remedy` are clean model-facing text**; maintainer provenance moved into `vendorEvidence` (entries prefixed `maintainer provenance (...)`, plain text, not JSON). `delete-absent` rows (8) are now kind `ok` with the missing DELETE in `deleteBoundary`; the kind stays in the closed set with 0 rows and the build fails if a row carries it. `non-mutable` is documented as blocking creates (0 rows). A build clause fails on provenance patterns.
27
+ - **`effectiveRequiredFields().fields` is the unconditional set**: `contracts.create` no longer returns `estimatedRevenue` / `estimatedHours` / `estimatedCost` there; they are in `conditional` (`contractType` 1).
28
+ - Docs reconciled: 97 `createGuidance` rows (one per create op) and 99 `zoneFacts.resources` entries.
29
+
30
+ ### Consumer notes (iit-mcp-autotask re-pin)
31
+
32
+ - Pass `allowAssumed: false` where an answer must not rest on the assumed `[5]`; pass `excludeStatusIds` to `companies.fullProfile`.
33
+ - `blocker.message` / `remedy` and `parentCompany`, `unsatisfiableViaApi`, `referenceField` are now clean data: the fixed blocker-sentence map can be dropped where these carry the fact. Treat `kind: 'delete-absent'` as gone (0 rows) and read `effectiveRequiredFields().conditional` / `.unproven`.
34
+ - Use `forResource({ countOnly: true })` for "how many tickets" questions.
35
+ - Serve `metadata.caveats` instead of the hard-coded `time_entries.update` "ticketID does NOT persist" note.
36
+ - Use `get(id, { fresh: true })` / `invokeRead({ fresh: true })` for read-backs instead of clearing `http.readCache`.
37
+ - **Simple-get detection:** every id-addressed `get` `inputSchema` gained `opts` (125 records; the 62 root gets go from 1 key to 2). A consumer that detects a simple get with `Object.keys(inputSchema).length === 1` must count the non-`opts` keys instead. `opts` is closed (`{ fresh?: boolean }`): a positional bag with a non-boolean `fresh` or an unknown key is refused before any request, and a direct `get(id, null)` is an empty bag (`invokeRead` still refuses a null bag as a wrong-typed `opts`).
38
+ - `forResource({ countOnly: true })` follows the link table's next-page links (up to 20 pages of 500) so `secondary` is exact below 10,000 links; `limit` is not validated there.
39
+
40
+ ## [0.33.0] - 2026-10-27
41
+
10
42
  Minor: the plan hash moves (a new op, and `contacts.create` / `contacts.update` lose the `sensitive` flag), so the next release is 0.33.0.
11
43
 
12
44
  ### Added
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "generatedBy": "scripts/build-tool-catalog.mjs",
3
- "generatedAt": "2026-10-27T11:39:16.203Z",
4
- "planHash": "913f1120488735c2e607cda13f9d551b11b3e6534d8a4b8310857d0bbd2fdb45",
3
+ "generatedAt": "2026-10-27T22:23:07.797Z",
4
+ "planHash": "08cf890fa1b2b50574638a1364993fced7e83a5dfd4f630763d80cdc01d5a5f1",
5
5
  "metaTools": [
6
6
  {
7
7
  "name": "autotask_catalog",
@@ -1,6 +1,6 @@
1
1
  # MCP Tool Manifest — node-autotask
2
2
 
3
- <!-- GENERATED by scripts/project-mcp-tools.mjs at 2026-10-27T11:39:16.407Z — do not hand-edit. -->
3
+ <!-- GENERATED by scripts/project-mcp-tools.mjs at 2026-10-27T22:23:07.655Z — do not hand-edit. -->
4
4
 
5
5
  Mechanical MCP projection of the capability registry (generator-design section 7, ARCHITECTURE section 19.5).
6
6
  Tool names are the plan `mcpTool` columns (entity-first `autotask_<entity>_<verb>`); descriptions are the
@@ -8,7 +8,7 @@ registry `purpose` + a mechanical bounds/flags sentence; annotations derive from
8
8
  Curation edits live ONLY in `MCP_TOOL_OVERRIDES.json` (records `{ tool, field, newValue, reason }`).
9
9
 
10
10
  Registry: 1280 operations; projected tools: 896 (one per registry op with a non-null `mcpTool`);
11
- not projected (catalog/describe material): 384. planHash: `913f1120488735c2…`
11
+ not projected (catalog/describe material): 384. planHash: `08cf890fa1b2b505…`
12
12
 
13
13
  ## Always-on core tier (CORE_RULE — computed, never a hand list)
14
14
 
@@ -1012,8 +1012,8 @@ the projection projects what the registry has and reports the gap so the Toolsmi
1012
1012
 
1013
1013
  ## Meta
1014
1014
 
1015
- - generatedAt: 2026-10-27T11:39:16.407Z
1016
- - planHash: 913f1120488735c2e607cda13f9d551b11b3e6534d8a4b8310857d0bbd2fdb45
1015
+ - generatedAt: 2026-10-27T22:23:07.655Z
1016
+ - planHash: 08cf890fa1b2b50574638a1364993fced7e83a5dfd4f630763d80cdc01d5a5f1
1017
1017
  - registry records: 1280
1018
1018
  - projected tools: 896
1019
1019
  - core tier: 15
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema": "node-autotask n8n consumer mcp projection v1",
3
- "generatedAt": "2026-10-27T11:39:16.557Z",
3
+ "generatedAt": "2026-10-27T22:23:07.920Z",
4
4
  "generator": "scripts/project-n8n-mcp.mjs",
5
5
  "inputs": {
6
6
  "capabilities": "capabilities.json (the capability registry — the single source of truth)",
@@ -3893,6 +3893,6 @@
3893
3893
  "approvalGatedWrites": 2,
3894
3894
  "destructiveExcluded": 4
3895
3895
  },
3896
- "capabilitiesHash": "ba97b65fc4424ba19d524a07a92892920d809ab6aa37fc7c79d849725e73861b",
3896
+ "capabilitiesHash": "4d850b84e72acda55dc952629b05d99549026251567d7b9fa7f0e12ffa921d5e",
3897
3897
  "curationHash": "e19117ce73e38d9aded3be7e7f077a4e185d2e10294622b76c17d67f63cf9e3b"
3898
3898
  }
@@ -1,6 +1,6 @@
1
1
  # N8N MCP Manifest — node-autotask (consumer projection)
2
2
 
3
- <!-- GENERATED by scripts/project-n8n-mcp.mjs at 2026-10-27T11:39:16.557Z — do not hand-edit. -->
3
+ <!-- GENERATED by scripts/project-n8n-mcp.mjs at 2026-10-27T22:23:07.920Z — do not hand-edit. -->
4
4
 
5
5
  The n8n CONSUMER projection of the capability registry: the canonical source for what the
6
6
  n8n-side MCP tools must expose. The SDK is canonical — this is a projection of it, never a
@@ -289,6 +289,6 @@ only via a recorded change to `n8n-mcp.curation.json`.
289
289
 
290
290
  ## Meta
291
291
 
292
- - generatedAt: 2026-10-27T11:39:16.557Z
293
- - capabilitiesHash: ba97b65fc4424ba19d524a07a92892920d809ab6aa37fc7c79d849725e73861b
292
+ - generatedAt: 2026-10-27T22:23:07.920Z
293
+ - capabilitiesHash: 4d850b84e72acda55dc952629b05d99549026251567d7b9fa7f0e12ffa921d5e
294
294
  - curationHash: e19117ce73e38d9aded3be7e7f077a4e185d2e10294622b76c17d67f63cf9e3b