node-autotask 0.8.0 → 0.8.1

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 (62) hide show
  1. package/ARCHITECTURE.md +54 -12
  2. package/N8N_MCP_MANIFEST.json +2 -2
  3. package/N8N_MCP_MANIFEST.md +3 -3
  4. package/README.md +9 -3
  5. package/dist/{chunk-C7U3ZRRK.js → chunk-2QLOK7PX.js} +27 -31
  6. package/dist/{chunk-C7U3ZRRK.js.map → chunk-2QLOK7PX.js.map} +1 -1
  7. package/dist/{chunk-LDKIIVFV.cjs → chunk-CQIZDSBE.cjs} +272 -276
  8. package/dist/chunk-CQIZDSBE.cjs.map +1 -0
  9. package/dist/{chunk-QUFEIJEB.cjs → chunk-DA73ALND.cjs} +136 -138
  10. package/dist/chunk-DA73ALND.cjs.map +1 -0
  11. package/dist/{chunk-GNS47RBV.js → chunk-IUJJPWUX.js} +612 -18
  12. package/dist/chunk-IUJJPWUX.js.map +1 -0
  13. package/dist/{chunk-RFXGG37L.cjs → chunk-IV2Z3JLR.cjs} +680 -86
  14. package/dist/chunk-IV2Z3JLR.cjs.map +1 -0
  15. package/dist/{chunk-ONPT4PIV.js → chunk-PAQXQFGG.js} +4 -6
  16. package/dist/{chunk-ONPT4PIV.js.map → chunk-PAQXQFGG.js.map} +1 -1
  17. package/dist/index.cjs +120 -27
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +129 -3
  20. package/dist/index.d.ts +129 -3
  21. package/dist/index.js +156 -63
  22. package/dist/index.js.map +1 -1
  23. package/dist/operations/index.cjs +113 -116
  24. package/dist/operations/index.cjs.map +1 -1
  25. package/dist/operations/index.js +9 -12
  26. package/dist/operations/index.js.map +1 -1
  27. package/dist/pool.cjs +8 -11
  28. package/dist/pool.cjs.map +1 -1
  29. package/dist/pool.js +4 -7
  30. package/dist/pool.js.map +1 -1
  31. package/dist/resources/index.cjs +3 -5
  32. package/dist/resources/index.cjs.map +1 -1
  33. package/dist/resources/index.js +2 -4
  34. package/package.json +9 -3
  35. package/dist/chunk-5QVXRT3A.cjs +0 -580
  36. package/dist/chunk-5QVXRT3A.cjs.map +0 -1
  37. package/dist/chunk-FE225M76.js +0 -580
  38. package/dist/chunk-FE225M76.js.map +0 -1
  39. package/dist/chunk-GNS47RBV.js.map +0 -1
  40. package/dist/chunk-IFXFOYDU.cjs +0 -32
  41. package/dist/chunk-IFXFOYDU.cjs.map +0 -1
  42. package/dist/chunk-LDKIIVFV.cjs.map +0 -1
  43. package/dist/chunk-OOEVTGP4.js +0 -121
  44. package/dist/chunk-OOEVTGP4.js.map +0 -1
  45. package/dist/chunk-PBBFMRI5.cjs +0 -121
  46. package/dist/chunk-PBBFMRI5.cjs.map +0 -1
  47. package/dist/chunk-QF4K3XTK.js +0 -32
  48. package/dist/chunk-QF4K3XTK.js.map +0 -1
  49. package/dist/chunk-QUFEIJEB.cjs.map +0 -1
  50. package/dist/chunk-RFXGG37L.cjs.map +0 -1
  51. package/dist/credential-shape.cjs +0 -15
  52. package/dist/credential-shape.cjs.map +0 -1
  53. package/dist/credential-shape.d.cts +0 -52
  54. package/dist/credential-shape.d.ts +0 -52
  55. package/dist/credential-shape.js +0 -15
  56. package/dist/credential-shape.js.map +0 -1
  57. package/dist/credentials.cjs +0 -17
  58. package/dist/credentials.cjs.map +0 -1
  59. package/dist/credentials.d.cts +0 -78
  60. package/dist/credentials.d.ts +0 -78
  61. package/dist/credentials.js +0 -17
  62. package/dist/credentials.js.map +0 -1
package/dist/pool.cjs CHANGED
@@ -1,35 +1,32 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
- var _chunkQUFEIJEBcjs = require('./chunk-QUFEIJEB.cjs');
4
- require('./chunk-LDKIIVFV.cjs');
3
+ var _chunkDA73ALNDcjs = require('./chunk-DA73ALND.cjs');
4
+ require('./chunk-CQIZDSBE.cjs');
5
5
 
6
6
 
7
- var _chunkRFXGG37Lcjs = require('./chunk-RFXGG37L.cjs');
8
- require('./chunk-U2PEBFPU.cjs');
9
-
10
7
 
11
- var _chunk5QVXRT3Acjs = require('./chunk-5QVXRT3A.cjs');
12
- require('./chunk-IFXFOYDU.cjs');
8
+ var _chunkIV2Z3JLRcjs = require('./chunk-IV2Z3JLR.cjs');
9
+ require('./chunk-U2PEBFPU.cjs');
13
10
 
14
11
  // src/pool.ts
15
12
  var _crypto = require('crypto');
16
13
  function createClientPool(options = {}) {
17
14
  const maxSize = _nullishCoalesce(options.maxSize, () => ( 128));
18
15
  if (!Number.isInteger(maxSize) || maxSize < 1) {
19
- throw new (0, _chunk5QVXRT3Acjs.AutotaskConfigError)(
16
+ throw new (0, _chunkIV2Z3JLRcjs.AutotaskConfigError)(
20
17
  `ClientPool maxSize must be a positive integer (got ${String(options.maxSize)})`
21
18
  );
22
19
  }
23
20
  const idleTtlMs = options.idleTtlMs;
24
21
  if (idleTtlMs !== void 0 && (!Number.isInteger(idleTtlMs) || idleTtlMs < 1)) {
25
- throw new (0, _chunk5QVXRT3Acjs.AutotaskConfigError)(
22
+ throw new (0, _chunkIV2Z3JLRcjs.AutotaskConfigError)(
26
23
  `ClientPool idleTtlMs must be a positive integer (got ${String(idleTtlMs)})`
27
24
  );
28
25
  }
29
- const factory = _nullishCoalesce(options.factory, () => ( ((config) => new (0, _chunkQUFEIJEBcjs.AutotaskClient)(config))));
26
+ const factory = _nullishCoalesce(options.factory, () => ( ((config) => new (0, _chunkDA73ALNDcjs.AutotaskClient)(config))));
30
27
  const entries = /* @__PURE__ */ new Map();
31
28
  function keyFor(config) {
32
- const resolved = _chunkRFXGG37Lcjs.resolveConfig.call(void 0, config);
29
+ const resolved = _chunkIV2Z3JLRcjs.resolveConfig.call(void 0, config);
33
30
  const tuple = [
34
31
  resolved.userName,
35
32
  resolved.apiIntegrationCode,
package/dist/pool.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/maxs/gitrepos/node-autotask/dist/pool.cjs","../src/pool.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACA;ACuBA,gCAA2B;AAoDpB,SAAS,gBAAA,CAAiB,QAAA,EAA6B,CAAC,CAAA,EAAe;AAC5E,EAAA,MAAM,QAAA,mBAAU,OAAA,CAAQ,OAAA,UAAW,KAAA;AACnC,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,SAAA,CAAU,OAAO,EAAA,GAAK,QAAA,EAAU,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAI,0CAAA;AAAA,MACR,CAAA,mDAAA,EAAsD,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAC,CAAA,CAAA;AAAA,IAC/E,CAAA;AAAA,EACF;AACA,EAAA,MAAM,UAAA,EAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,GAAA,CAAI,UAAA,IAAc,KAAA,EAAA,GAAA,CAAc,CAAC,MAAA,CAAO,SAAA,CAAU,SAAS,EAAA,GAAK,UAAA,EAAY,CAAA,CAAA,EAAI;AAC9E,IAAA,MAAM,IAAI,0CAAA;AAAA,MACR,CAAA,qDAAA,EAAwD,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,IAC3E,CAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAA,mBAAU,OAAA,CAAQ,OAAA,UAAA,CAAY,CAAC,MAAA,EAAA,GAA2B,IAAI,qCAAA,CAAe,MAAM,CAAA,GAAA;AAIzF,EAAA,MAAM,QAAA,kBAAU,IAAI,GAAA,CAAuB,CAAA;AAS3C,EAAA,SAAS,MAAA,CAAO,MAAA,EAAgC;AAC9C,IAAA,MAAM,SAAA,EAAW,6CAAA,MAAoB,CAAA;AACrC,IAAA,MAAM,MAAA,EAAQ;AAAA,MACZ,QAAA,CAAS,QAAA;AAAA,MACT,QAAA,CAAS,kBAAA;AAAA,MACT,QAAA,CAAS,MAAA;AAAA,MACT,QAAA,CAAS,OAAA;AAAA,uBACT,QAAA,CAAS,uBAAA,UAA2B;AAAA,IACtC,CAAA,CAAE,IAAA,CAAK,IAAQ,CAAA;AACf,IAAA,OAAO,gCAAA,QAAmB,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,MAAA,EAAwC;AAC1C,MAAA,MAAM,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AACzB,MAAA,MAAM,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAA;AACrB,MAAA,MAAM,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC3B,MAAA,GAAA,CAAI,IAAA,IAAQ,KAAA,CAAA,EAAW;AACrB,QAAA,GAAA,CAAI,UAAA,IAAc,KAAA,EAAA,GAAa,IAAA,EAAM,GAAA,CAAI,OAAA,EAAS,SAAA,EAAW;AAG3D,UAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAAA,QACpB,EAAA,KAAO;AACL,UAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA;AAClB,UAAA,MAAM,UAAA,EAAuB,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAC/D,UAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,SAAS,CAAA;AAC1B,UAAA,OAAO,GAAA,CAAI,MAAA;AAAA,QACb;AAAA,MACF;AACA,MAAA,GAAA,CAAI,OAAA,CAAQ,KAAA,GAAQ,OAAA,EAAS;AAC3B,QAAA,MAAM,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,CAAA,CAAE,KAAA;AACrC,QAAA,GAAA,CAAI,OAAA,IAAW,KAAA,CAAA,EAAW,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AAAA,MACjD;AACA,MAAA,MAAM,QAAA,EAAqB,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG,MAAA,EAAQ,IAAI,CAAA;AAClE,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AACxB,MAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IACjB,CAAA;AAAA,IAEA,MAAA,CAAO,MAAA,EAAiC;AACtC,MAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,KAAA,CAAA,EAAc;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA;AAAA,IAChB,CAAA;AAAA,IAEA,IAAI,IAAA,CAAA,EAAe;AACjB,MAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,IACjB;AAAA,EACF,CAAA;AACF;ADzFA;AACE;AACF,4CAAC","file":"/Users/maxs/gitrepos/node-autotask/dist/pool.cjs","sourcesContent":[null,"/**\n * ClientPool — a bounded LRU of `AutotaskClient` instances keyed by a hash\n * of the credential tuple (issue #5).\n *\n * A multi-tenant gateway that receives credentials per request reuses ONE\n * client per tenant: each client's limiter state (the concurrency\n * semaphore, the sliding-window hourly budget, the optional read cache)\n * lives on its transport, so reuse is what makes limits meaningful — a\n * fresh client per request would reset all of them (rate limits effectively\n * bypassed, cache never warms). Construction is cheap (no network), so the\n * gain is correctness of limiting, not startup time.\n *\n * Contract (the `./pool` subpath — the root API stays lean):\n * - `createClientPool({ maxSize = 128, idleTtlMs?, factory? })` returns\n * `{ get(config), delete(config), clear(), size }`.\n * - Key: sha256 of the NORMALISED tuple (user, integration code, secret,\n * resolved base URL, impersonation id) — a zone and the equivalent base\n * URL resolve to the same key. The secret is part of the key material,\n * but the key is a digest: it never logs or exposes a raw credential.\n * - `get` is get-or-create and SYNCHRONOUS, so concurrent first requests\n * share one client. A hit refreshes recency (plain Map LRU — insertion\n * order is least-recent-use first). Overflow evicts the least recently\n * used entry WITHOUT aborting its in-flight requests: a recreated tenant\n * starts with a fresh limiter, so a brief overshoot is possible under\n * heavy churn (documented, not prevented).\n * - `idleTtlMs` is checked LAZILY on `get` — no timers. An expired entry\n * is a miss: it is evicted and the tenant starts fresh.\n * - `maxSize` must be a positive integer, else `AutotaskConfigError`.\n * - Pooling stays OUTSIDE auth policy: the caller deletes an entry on a\n * 401 (`delete(config)`) and decides on any negative caching.\n * - Pooled clients keep their read cache across requests: a tenant's\n * cache is shared between its requests and never across tenants.\n *\n * Zero runtime dependencies (node:crypto only). No new dependencies,\n * `sideEffects: false` preserved.\n */\nimport { createHash } from 'node:crypto';\n\nimport { AutotaskClient } from './client.js';\nimport { resolveConfig, type AutotaskConfig } from './config.js';\nimport { AutotaskConfigError } from './errors.js';\n\nexport interface ClientPoolOptions {\n /** Bounded LRU capacity (positive integer). Default 128. */\n maxSize?: number;\n /**\n * Evict a client idle for longer than this (ms) on the next `get` (checked\n * lazily — no timers). Must be a positive integer when set.\n */\n idleTtlMs?: number;\n /** Client factory (injectable for tests). Default: `new AutotaskClient(config)`. */\n factory?: (config: AutotaskConfig) => AutotaskClient;\n}\n\nexport interface ClientPool {\n /**\n * Get-or-create the client for this credential tuple (synchronous).\n * A hit refreshes recency; an idle-TTL-expired entry is a miss.\n * Overflow evicts the least recently used entry without aborting its\n * in-flight requests. Invalid config throws `AutotaskConfigError`\n * (fail closed — the same validation the client constructor runs).\n */\n get(config: AutotaskConfig): AutotaskClient;\n /**\n * Remove the entry for this credential tuple (callers do this on a 401 —\n * the tenant then starts fresh on the next `get`). True when an entry\n * was removed.\n */\n delete(config: AutotaskConfig): boolean;\n /** Remove every entry (in-flight requests on evicted clients keep running). */\n clear(): void;\n /** Number of currently pooled clients. */\n readonly size: number;\n}\n\ninterface PoolEntry {\n client: AutotaskClient;\n /** Timestamp (ms) of the last `get` hit or creation. */\n usedAt: number;\n}\n\n/**\n * Create a bounded LRU pool of `AutotaskClient`s.\n *\n * `maxSize` must be a positive integer (default 128); `idleTtlMs`, when\n * set, must be a positive integer. Both throw `AutotaskConfigError`\n * otherwise (fail closed, before any client is created).\n */\nexport function createClientPool(options: ClientPoolOptions = {}): ClientPool {\n const maxSize = options.maxSize ?? 128;\n if (!Number.isInteger(maxSize) || maxSize < 1) {\n throw new AutotaskConfigError(\n `ClientPool maxSize must be a positive integer (got ${String(options.maxSize)})`,\n );\n }\n const idleTtlMs = options.idleTtlMs;\n if (idleTtlMs !== undefined && (!Number.isInteger(idleTtlMs) || idleTtlMs < 1)) {\n throw new AutotaskConfigError(\n `ClientPool idleTtlMs must be a positive integer (got ${String(idleTtlMs)})`,\n );\n }\n const factory = options.factory ?? ((config: AutotaskConfig) => new AutotaskClient(config));\n\n // Plain Map LRU: insertion order is least-recent-use first; a hit\n // delete-then-re-sets the entry so it moves to the tail (most recent).\n const entries = new Map<string, PoolEntry>();\n\n /**\n * sha256 of the normalised credential tuple. `resolveConfig` trims the\n * credentials and resolves zone → base URL, so a zone and the equivalent\n * base URL hash identically. The result is a hex digest — the key never\n * contains a raw credential value (the secret is key MATERIAL, not key\n * TEXT).\n */\n function keyFor(config: AutotaskConfig): string {\n const resolved = resolveConfig(config);\n const tuple = [\n resolved.userName,\n resolved.apiIntegrationCode,\n resolved.secret,\n resolved.baseUrl,\n resolved.impersonationResourceId ?? '',\n ].join('\\u0000');\n return createHash('sha256').update(tuple, 'utf8').digest('hex');\n }\n\n return {\n get(config: AutotaskConfig): AutotaskClient {\n const key = keyFor(config);\n const now = Date.now();\n const hit = entries.get(key);\n if (hit !== undefined) {\n if (idleTtlMs !== undefined && now - hit.usedAt > idleTtlMs) {\n // Idle-expired: a miss. Evict (in-flight requests on the evicted\n // client keep running) and fall through to recreation.\n entries.delete(key);\n } else {\n entries.delete(key);\n const refreshed: PoolEntry = { client: hit.client, usedAt: now };\n entries.set(key, refreshed);\n return hit.client;\n }\n }\n if (entries.size >= maxSize) {\n const oldest = entries.keys().next().value;\n if (oldest !== undefined) entries.delete(oldest);\n }\n const created: PoolEntry = { client: factory(config), usedAt: now };\n entries.set(key, created);\n return created.client;\n },\n\n delete(config: AutotaskConfig): boolean {\n return entries.delete(keyFor(config));\n },\n\n clear(): void {\n entries.clear();\n },\n\n get size(): number {\n return entries.size;\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["/Users/maxs/gitrepos/node-autotask/dist/pool.cjs","../src/pool.ts"],"names":[],"mappings":"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","file":"/Users/maxs/gitrepos/node-autotask/dist/pool.cjs","sourcesContent":[null,"/**\n * ClientPool — a bounded LRU of `AutotaskClient` instances keyed by a hash\n * of the credential tuple (issue #5).\n *\n * A multi-tenant gateway that receives credentials per request reuses ONE\n * client per tenant: each client's limiter state (the concurrency\n * semaphore, the sliding-window hourly budget, the optional read cache)\n * lives on its transport, so reuse is what makes limits meaningful — a\n * fresh client per request would reset all of them (rate limits effectively\n * bypassed, cache never warms). Construction is cheap (no network), so the\n * gain is correctness of limiting, not startup time.\n *\n * Contract (the `./pool` subpath — the root API stays lean):\n * - `createClientPool({ maxSize = 128, idleTtlMs?, factory? })` returns\n * `{ get(config), delete(config), clear(), size }`.\n * - Key: sha256 of the NORMALISED tuple (user, integration code, secret,\n * resolved base URL, impersonation id) — a zone and the equivalent base\n * URL resolve to the same key. The secret is part of the key material,\n * but the key is a digest: it never logs or exposes a raw credential.\n * - `get` is get-or-create and SYNCHRONOUS, so concurrent first requests\n * share one client. A hit refreshes recency (plain Map LRU — insertion\n * order is least-recent-use first). Overflow evicts the least recently\n * used entry WITHOUT aborting its in-flight requests: a recreated tenant\n * starts with a fresh limiter, so a brief overshoot is possible under\n * heavy churn (documented, not prevented).\n * - `idleTtlMs` is checked LAZILY on `get` — no timers. An expired entry\n * is a miss: it is evicted and the tenant starts fresh.\n * - `maxSize` must be a positive integer, else `AutotaskConfigError`.\n * - Pooling stays OUTSIDE auth policy: the caller deletes an entry on a\n * 401 (`delete(config)`) and decides on any negative caching.\n * - Pooled clients keep their read cache across requests: a tenant's\n * cache is shared between its requests and never across tenants.\n *\n * Zero runtime dependencies (node:crypto only). No new dependencies,\n * `sideEffects: false` preserved.\n */\nimport { createHash } from 'node:crypto';\n\nimport { AutotaskClient } from './client.js';\nimport { resolveConfig, type AutotaskConfig } from './config.js';\nimport { AutotaskConfigError } from './errors.js';\n\nexport interface ClientPoolOptions {\n /** Bounded LRU capacity (positive integer). Default 128. */\n maxSize?: number;\n /**\n * Evict a client idle for longer than this (ms) on the next `get` (checked\n * lazily — no timers). Must be a positive integer when set.\n */\n idleTtlMs?: number;\n /** Client factory (injectable for tests). Default: `new AutotaskClient(config)`. */\n factory?: (config: AutotaskConfig) => AutotaskClient;\n}\n\nexport interface ClientPool {\n /**\n * Get-or-create the client for this credential tuple (synchronous).\n * A hit refreshes recency; an idle-TTL-expired entry is a miss.\n * Overflow evicts the least recently used entry without aborting its\n * in-flight requests. Invalid config throws `AutotaskConfigError`\n * (fail closed — the same validation the client constructor runs).\n */\n get(config: AutotaskConfig): AutotaskClient;\n /**\n * Remove the entry for this credential tuple (callers do this on a 401 —\n * the tenant then starts fresh on the next `get`). True when an entry\n * was removed.\n */\n delete(config: AutotaskConfig): boolean;\n /** Remove every entry (in-flight requests on evicted clients keep running). */\n clear(): void;\n /** Number of currently pooled clients. */\n readonly size: number;\n}\n\ninterface PoolEntry {\n client: AutotaskClient;\n /** Timestamp (ms) of the last `get` hit or creation. */\n usedAt: number;\n}\n\n/**\n * Create a bounded LRU pool of `AutotaskClient`s.\n *\n * `maxSize` must be a positive integer (default 128); `idleTtlMs`, when\n * set, must be a positive integer. Both throw `AutotaskConfigError`\n * otherwise (fail closed, before any client is created).\n */\nexport function createClientPool(options: ClientPoolOptions = {}): ClientPool {\n const maxSize = options.maxSize ?? 128;\n if (!Number.isInteger(maxSize) || maxSize < 1) {\n throw new AutotaskConfigError(\n `ClientPool maxSize must be a positive integer (got ${String(options.maxSize)})`,\n );\n }\n const idleTtlMs = options.idleTtlMs;\n if (idleTtlMs !== undefined && (!Number.isInteger(idleTtlMs) || idleTtlMs < 1)) {\n throw new AutotaskConfigError(\n `ClientPool idleTtlMs must be a positive integer (got ${String(idleTtlMs)})`,\n );\n }\n const factory = options.factory ?? ((config: AutotaskConfig) => new AutotaskClient(config));\n\n // Plain Map LRU: insertion order is least-recent-use first; a hit\n // delete-then-re-sets the entry so it moves to the tail (most recent).\n const entries = new Map<string, PoolEntry>();\n\n /**\n * sha256 of the normalised credential tuple. `resolveConfig` trims the\n * credentials and resolves zone → base URL, so a zone and the equivalent\n * base URL hash identically. The result is a hex digest — the key never\n * contains a raw credential value (the secret is key MATERIAL, not key\n * TEXT).\n */\n function keyFor(config: AutotaskConfig): string {\n const resolved = resolveConfig(config);\n const tuple = [\n resolved.userName,\n resolved.apiIntegrationCode,\n resolved.secret,\n resolved.baseUrl,\n resolved.impersonationResourceId ?? '',\n ].join('\\u0000');\n return createHash('sha256').update(tuple, 'utf8').digest('hex');\n }\n\n return {\n get(config: AutotaskConfig): AutotaskClient {\n const key = keyFor(config);\n const now = Date.now();\n const hit = entries.get(key);\n if (hit !== undefined) {\n if (idleTtlMs !== undefined && now - hit.usedAt > idleTtlMs) {\n // Idle-expired: a miss. Evict (in-flight requests on the evicted\n // client keep running) and fall through to recreation.\n entries.delete(key);\n } else {\n entries.delete(key);\n const refreshed: PoolEntry = { client: hit.client, usedAt: now };\n entries.set(key, refreshed);\n return hit.client;\n }\n }\n if (entries.size >= maxSize) {\n const oldest = entries.keys().next().value;\n if (oldest !== undefined) entries.delete(oldest);\n }\n const created: PoolEntry = { client: factory(config), usedAt: now };\n entries.set(key, created);\n return created.client;\n },\n\n delete(config: AutotaskConfig): boolean {\n return entries.delete(keyFor(config));\n },\n\n clear(): void {\n entries.clear();\n },\n\n get size(): number {\n return entries.size;\n },\n };\n}\n"]}
package/dist/pool.js CHANGED
@@ -1,15 +1,12 @@
1
1
  import {
2
2
  AutotaskClient
3
- } from "./chunk-ONPT4PIV.js";
4
- import "./chunk-C7U3ZRRK.js";
3
+ } from "./chunk-PAQXQFGG.js";
4
+ import "./chunk-2QLOK7PX.js";
5
5
  import {
6
+ AutotaskConfigError,
6
7
  resolveConfig
7
- } from "./chunk-GNS47RBV.js";
8
+ } from "./chunk-IUJJPWUX.js";
8
9
  import "./chunk-LBNDOP4A.js";
9
- import {
10
- AutotaskConfigError
11
- } from "./chunk-FE225M76.js";
12
- import "./chunk-QF4K3XTK.js";
13
10
 
14
11
  // src/pool.ts
15
12
  import { createHash } from "crypto";
package/dist/pool.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pool.ts"],"sourcesContent":["/**\n * ClientPool — a bounded LRU of `AutotaskClient` instances keyed by a hash\n * of the credential tuple (issue #5).\n *\n * A multi-tenant gateway that receives credentials per request reuses ONE\n * client per tenant: each client's limiter state (the concurrency\n * semaphore, the sliding-window hourly budget, the optional read cache)\n * lives on its transport, so reuse is what makes limits meaningful — a\n * fresh client per request would reset all of them (rate limits effectively\n * bypassed, cache never warms). Construction is cheap (no network), so the\n * gain is correctness of limiting, not startup time.\n *\n * Contract (the `./pool` subpath — the root API stays lean):\n * - `createClientPool({ maxSize = 128, idleTtlMs?, factory? })` returns\n * `{ get(config), delete(config), clear(), size }`.\n * - Key: sha256 of the NORMALISED tuple (user, integration code, secret,\n * resolved base URL, impersonation id) — a zone and the equivalent base\n * URL resolve to the same key. The secret is part of the key material,\n * but the key is a digest: it never logs or exposes a raw credential.\n * - `get` is get-or-create and SYNCHRONOUS, so concurrent first requests\n * share one client. A hit refreshes recency (plain Map LRU — insertion\n * order is least-recent-use first). Overflow evicts the least recently\n * used entry WITHOUT aborting its in-flight requests: a recreated tenant\n * starts with a fresh limiter, so a brief overshoot is possible under\n * heavy churn (documented, not prevented).\n * - `idleTtlMs` is checked LAZILY on `get` — no timers. An expired entry\n * is a miss: it is evicted and the tenant starts fresh.\n * - `maxSize` must be a positive integer, else `AutotaskConfigError`.\n * - Pooling stays OUTSIDE auth policy: the caller deletes an entry on a\n * 401 (`delete(config)`) and decides on any negative caching.\n * - Pooled clients keep their read cache across requests: a tenant's\n * cache is shared between its requests and never across tenants.\n *\n * Zero runtime dependencies (node:crypto only). No new dependencies,\n * `sideEffects: false` preserved.\n */\nimport { createHash } from 'node:crypto';\n\nimport { AutotaskClient } from './client.js';\nimport { resolveConfig, type AutotaskConfig } from './config.js';\nimport { AutotaskConfigError } from './errors.js';\n\nexport interface ClientPoolOptions {\n /** Bounded LRU capacity (positive integer). Default 128. */\n maxSize?: number;\n /**\n * Evict a client idle for longer than this (ms) on the next `get` (checked\n * lazily — no timers). Must be a positive integer when set.\n */\n idleTtlMs?: number;\n /** Client factory (injectable for tests). Default: `new AutotaskClient(config)`. */\n factory?: (config: AutotaskConfig) => AutotaskClient;\n}\n\nexport interface ClientPool {\n /**\n * Get-or-create the client for this credential tuple (synchronous).\n * A hit refreshes recency; an idle-TTL-expired entry is a miss.\n * Overflow evicts the least recently used entry without aborting its\n * in-flight requests. Invalid config throws `AutotaskConfigError`\n * (fail closed — the same validation the client constructor runs).\n */\n get(config: AutotaskConfig): AutotaskClient;\n /**\n * Remove the entry for this credential tuple (callers do this on a 401 —\n * the tenant then starts fresh on the next `get`). True when an entry\n * was removed.\n */\n delete(config: AutotaskConfig): boolean;\n /** Remove every entry (in-flight requests on evicted clients keep running). */\n clear(): void;\n /** Number of currently pooled clients. */\n readonly size: number;\n}\n\ninterface PoolEntry {\n client: AutotaskClient;\n /** Timestamp (ms) of the last `get` hit or creation. */\n usedAt: number;\n}\n\n/**\n * Create a bounded LRU pool of `AutotaskClient`s.\n *\n * `maxSize` must be a positive integer (default 128); `idleTtlMs`, when\n * set, must be a positive integer. Both throw `AutotaskConfigError`\n * otherwise (fail closed, before any client is created).\n */\nexport function createClientPool(options: ClientPoolOptions = {}): ClientPool {\n const maxSize = options.maxSize ?? 128;\n if (!Number.isInteger(maxSize) || maxSize < 1) {\n throw new AutotaskConfigError(\n `ClientPool maxSize must be a positive integer (got ${String(options.maxSize)})`,\n );\n }\n const idleTtlMs = options.idleTtlMs;\n if (idleTtlMs !== undefined && (!Number.isInteger(idleTtlMs) || idleTtlMs < 1)) {\n throw new AutotaskConfigError(\n `ClientPool idleTtlMs must be a positive integer (got ${String(idleTtlMs)})`,\n );\n }\n const factory = options.factory ?? ((config: AutotaskConfig) => new AutotaskClient(config));\n\n // Plain Map LRU: insertion order is least-recent-use first; a hit\n // delete-then-re-sets the entry so it moves to the tail (most recent).\n const entries = new Map<string, PoolEntry>();\n\n /**\n * sha256 of the normalised credential tuple. `resolveConfig` trims the\n * credentials and resolves zone → base URL, so a zone and the equivalent\n * base URL hash identically. The result is a hex digest — the key never\n * contains a raw credential value (the secret is key MATERIAL, not key\n * TEXT).\n */\n function keyFor(config: AutotaskConfig): string {\n const resolved = resolveConfig(config);\n const tuple = [\n resolved.userName,\n resolved.apiIntegrationCode,\n resolved.secret,\n resolved.baseUrl,\n resolved.impersonationResourceId ?? '',\n ].join('\\u0000');\n return createHash('sha256').update(tuple, 'utf8').digest('hex');\n }\n\n return {\n get(config: AutotaskConfig): AutotaskClient {\n const key = keyFor(config);\n const now = Date.now();\n const hit = entries.get(key);\n if (hit !== undefined) {\n if (idleTtlMs !== undefined && now - hit.usedAt > idleTtlMs) {\n // Idle-expired: a miss. Evict (in-flight requests on the evicted\n // client keep running) and fall through to recreation.\n entries.delete(key);\n } else {\n entries.delete(key);\n const refreshed: PoolEntry = { client: hit.client, usedAt: now };\n entries.set(key, refreshed);\n return hit.client;\n }\n }\n if (entries.size >= maxSize) {\n const oldest = entries.keys().next().value;\n if (oldest !== undefined) entries.delete(oldest);\n }\n const created: PoolEntry = { client: factory(config), usedAt: now };\n entries.set(key, created);\n return created.client;\n },\n\n delete(config: AutotaskConfig): boolean {\n return entries.delete(keyFor(config));\n },\n\n clear(): void {\n entries.clear();\n },\n\n get size(): number {\n return entries.size;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAoCA,SAAS,kBAAkB;AAoDpB,SAAS,iBAAiB,UAA6B,CAAC,GAAe;AAC5E,QAAM,UAAU,QAAQ,WAAW;AACnC,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,GAAG;AAC7C,UAAM,IAAI;AAAA,MACR,sDAAsD,OAAO,QAAQ,OAAO,CAAC;AAAA,IAC/E;AAAA,EACF;AACA,QAAM,YAAY,QAAQ;AAC1B,MAAI,cAAc,WAAc,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,IAAI;AAC9E,UAAM,IAAI;AAAA,MACR,wDAAwD,OAAO,SAAS,CAAC;AAAA,IAC3E;AAAA,EACF;AACA,QAAM,UAAU,QAAQ,YAAY,CAAC,WAA2B,IAAI,eAAe,MAAM;AAIzF,QAAM,UAAU,oBAAI,IAAuB;AAS3C,WAAS,OAAO,QAAgC;AAC9C,UAAM,WAAW,cAAc,MAAM;AACrC,UAAM,QAAQ;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS,2BAA2B;AAAA,IACtC,EAAE,KAAK,IAAQ;AACf,WAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,MAAM,EAAE,OAAO,KAAK;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,IAAI,QAAwC;AAC1C,YAAM,MAAM,OAAO,MAAM;AACzB,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,MAAM,QAAQ,IAAI,GAAG;AAC3B,UAAI,QAAQ,QAAW;AACrB,YAAI,cAAc,UAAa,MAAM,IAAI,SAAS,WAAW;AAG3D,kBAAQ,OAAO,GAAG;AAAA,QACpB,OAAO;AACL,kBAAQ,OAAO,GAAG;AAClB,gBAAM,YAAuB,EAAE,QAAQ,IAAI,QAAQ,QAAQ,IAAI;AAC/D,kBAAQ,IAAI,KAAK,SAAS;AAC1B,iBAAO,IAAI;AAAA,QACb;AAAA,MACF;AACA,UAAI,QAAQ,QAAQ,SAAS;AAC3B,cAAM,SAAS,QAAQ,KAAK,EAAE,KAAK,EAAE;AACrC,YAAI,WAAW,OAAW,SAAQ,OAAO,MAAM;AAAA,MACjD;AACA,YAAM,UAAqB,EAAE,QAAQ,QAAQ,MAAM,GAAG,QAAQ,IAAI;AAClE,cAAQ,IAAI,KAAK,OAAO;AACxB,aAAO,QAAQ;AAAA,IACjB;AAAA,IAEA,OAAO,QAAiC;AACtC,aAAO,QAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,IACtC;AAAA,IAEA,QAAc;AACZ,cAAQ,MAAM;AAAA,IAChB;AAAA,IAEA,IAAI,OAAe;AACjB,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/pool.ts"],"sourcesContent":["/**\n * ClientPool — a bounded LRU of `AutotaskClient` instances keyed by a hash\n * of the credential tuple (issue #5).\n *\n * A multi-tenant gateway that receives credentials per request reuses ONE\n * client per tenant: each client's limiter state (the concurrency\n * semaphore, the sliding-window hourly budget, the optional read cache)\n * lives on its transport, so reuse is what makes limits meaningful — a\n * fresh client per request would reset all of them (rate limits effectively\n * bypassed, cache never warms). Construction is cheap (no network), so the\n * gain is correctness of limiting, not startup time.\n *\n * Contract (the `./pool` subpath — the root API stays lean):\n * - `createClientPool({ maxSize = 128, idleTtlMs?, factory? })` returns\n * `{ get(config), delete(config), clear(), size }`.\n * - Key: sha256 of the NORMALISED tuple (user, integration code, secret,\n * resolved base URL, impersonation id) — a zone and the equivalent base\n * URL resolve to the same key. The secret is part of the key material,\n * but the key is a digest: it never logs or exposes a raw credential.\n * - `get` is get-or-create and SYNCHRONOUS, so concurrent first requests\n * share one client. A hit refreshes recency (plain Map LRU — insertion\n * order is least-recent-use first). Overflow evicts the least recently\n * used entry WITHOUT aborting its in-flight requests: a recreated tenant\n * starts with a fresh limiter, so a brief overshoot is possible under\n * heavy churn (documented, not prevented).\n * - `idleTtlMs` is checked LAZILY on `get` — no timers. An expired entry\n * is a miss: it is evicted and the tenant starts fresh.\n * - `maxSize` must be a positive integer, else `AutotaskConfigError`.\n * - Pooling stays OUTSIDE auth policy: the caller deletes an entry on a\n * 401 (`delete(config)`) and decides on any negative caching.\n * - Pooled clients keep their read cache across requests: a tenant's\n * cache is shared between its requests and never across tenants.\n *\n * Zero runtime dependencies (node:crypto only). No new dependencies,\n * `sideEffects: false` preserved.\n */\nimport { createHash } from 'node:crypto';\n\nimport { AutotaskClient } from './client.js';\nimport { resolveConfig, type AutotaskConfig } from './config.js';\nimport { AutotaskConfigError } from './errors.js';\n\nexport interface ClientPoolOptions {\n /** Bounded LRU capacity (positive integer). Default 128. */\n maxSize?: number;\n /**\n * Evict a client idle for longer than this (ms) on the next `get` (checked\n * lazily — no timers). Must be a positive integer when set.\n */\n idleTtlMs?: number;\n /** Client factory (injectable for tests). Default: `new AutotaskClient(config)`. */\n factory?: (config: AutotaskConfig) => AutotaskClient;\n}\n\nexport interface ClientPool {\n /**\n * Get-or-create the client for this credential tuple (synchronous).\n * A hit refreshes recency; an idle-TTL-expired entry is a miss.\n * Overflow evicts the least recently used entry without aborting its\n * in-flight requests. Invalid config throws `AutotaskConfigError`\n * (fail closed — the same validation the client constructor runs).\n */\n get(config: AutotaskConfig): AutotaskClient;\n /**\n * Remove the entry for this credential tuple (callers do this on a 401 —\n * the tenant then starts fresh on the next `get`). True when an entry\n * was removed.\n */\n delete(config: AutotaskConfig): boolean;\n /** Remove every entry (in-flight requests on evicted clients keep running). */\n clear(): void;\n /** Number of currently pooled clients. */\n readonly size: number;\n}\n\ninterface PoolEntry {\n client: AutotaskClient;\n /** Timestamp (ms) of the last `get` hit or creation. */\n usedAt: number;\n}\n\n/**\n * Create a bounded LRU pool of `AutotaskClient`s.\n *\n * `maxSize` must be a positive integer (default 128); `idleTtlMs`, when\n * set, must be a positive integer. Both throw `AutotaskConfigError`\n * otherwise (fail closed, before any client is created).\n */\nexport function createClientPool(options: ClientPoolOptions = {}): ClientPool {\n const maxSize = options.maxSize ?? 128;\n if (!Number.isInteger(maxSize) || maxSize < 1) {\n throw new AutotaskConfigError(\n `ClientPool maxSize must be a positive integer (got ${String(options.maxSize)})`,\n );\n }\n const idleTtlMs = options.idleTtlMs;\n if (idleTtlMs !== undefined && (!Number.isInteger(idleTtlMs) || idleTtlMs < 1)) {\n throw new AutotaskConfigError(\n `ClientPool idleTtlMs must be a positive integer (got ${String(idleTtlMs)})`,\n );\n }\n const factory = options.factory ?? ((config: AutotaskConfig) => new AutotaskClient(config));\n\n // Plain Map LRU: insertion order is least-recent-use first; a hit\n // delete-then-re-sets the entry so it moves to the tail (most recent).\n const entries = new Map<string, PoolEntry>();\n\n /**\n * sha256 of the normalised credential tuple. `resolveConfig` trims the\n * credentials and resolves zone → base URL, so a zone and the equivalent\n * base URL hash identically. The result is a hex digest — the key never\n * contains a raw credential value (the secret is key MATERIAL, not key\n * TEXT).\n */\n function keyFor(config: AutotaskConfig): string {\n const resolved = resolveConfig(config);\n const tuple = [\n resolved.userName,\n resolved.apiIntegrationCode,\n resolved.secret,\n resolved.baseUrl,\n resolved.impersonationResourceId ?? '',\n ].join('\\u0000');\n return createHash('sha256').update(tuple, 'utf8').digest('hex');\n }\n\n return {\n get(config: AutotaskConfig): AutotaskClient {\n const key = keyFor(config);\n const now = Date.now();\n const hit = entries.get(key);\n if (hit !== undefined) {\n if (idleTtlMs !== undefined && now - hit.usedAt > idleTtlMs) {\n // Idle-expired: a miss. Evict (in-flight requests on the evicted\n // client keep running) and fall through to recreation.\n entries.delete(key);\n } else {\n entries.delete(key);\n const refreshed: PoolEntry = { client: hit.client, usedAt: now };\n entries.set(key, refreshed);\n return hit.client;\n }\n }\n if (entries.size >= maxSize) {\n const oldest = entries.keys().next().value;\n if (oldest !== undefined) entries.delete(oldest);\n }\n const created: PoolEntry = { client: factory(config), usedAt: now };\n entries.set(key, created);\n return created.client;\n },\n\n delete(config: AutotaskConfig): boolean {\n return entries.delete(keyFor(config));\n },\n\n clear(): void {\n entries.clear();\n },\n\n get size(): number {\n return entries.size;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;AAoCA,SAAS,kBAAkB;AAoDpB,SAAS,iBAAiB,UAA6B,CAAC,GAAe;AAC5E,QAAM,UAAU,QAAQ,WAAW;AACnC,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,GAAG;AAC7C,UAAM,IAAI;AAAA,MACR,sDAAsD,OAAO,QAAQ,OAAO,CAAC;AAAA,IAC/E;AAAA,EACF;AACA,QAAM,YAAY,QAAQ;AAC1B,MAAI,cAAc,WAAc,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,IAAI;AAC9E,UAAM,IAAI;AAAA,MACR,wDAAwD,OAAO,SAAS,CAAC;AAAA,IAC3E;AAAA,EACF;AACA,QAAM,UAAU,QAAQ,YAAY,CAAC,WAA2B,IAAI,eAAe,MAAM;AAIzF,QAAM,UAAU,oBAAI,IAAuB;AAS3C,WAAS,OAAO,QAAgC;AAC9C,UAAM,WAAW,cAAc,MAAM;AACrC,UAAM,QAAQ;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS,2BAA2B;AAAA,IACtC,EAAE,KAAK,IAAQ;AACf,WAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,MAAM,EAAE,OAAO,KAAK;AAAA,EAChE;AAEA,SAAO;AAAA,IACL,IAAI,QAAwC;AAC1C,YAAM,MAAM,OAAO,MAAM;AACzB,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,MAAM,QAAQ,IAAI,GAAG;AAC3B,UAAI,QAAQ,QAAW;AACrB,YAAI,cAAc,UAAa,MAAM,IAAI,SAAS,WAAW;AAG3D,kBAAQ,OAAO,GAAG;AAAA,QACpB,OAAO;AACL,kBAAQ,OAAO,GAAG;AAClB,gBAAM,YAAuB,EAAE,QAAQ,IAAI,QAAQ,QAAQ,IAAI;AAC/D,kBAAQ,IAAI,KAAK,SAAS;AAC1B,iBAAO,IAAI;AAAA,QACb;AAAA,MACF;AACA,UAAI,QAAQ,QAAQ,SAAS;AAC3B,cAAM,SAAS,QAAQ,KAAK,EAAE,KAAK,EAAE;AACrC,YAAI,WAAW,OAAW,SAAQ,OAAO,MAAM;AAAA,MACjD;AACA,YAAM,UAAqB,EAAE,QAAQ,QAAQ,MAAM,GAAG,QAAQ,IAAI;AAClE,cAAQ,IAAI,KAAK,OAAO;AACxB,aAAO,QAAQ;AAAA,IACjB;AAAA,IAEA,OAAO,QAAiC;AACtC,aAAO,QAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,IACtC;AAAA,IAEA,QAAc;AACZ,cAAQ,MAAM;AAAA,IAChB;AAAA,IAEA,IAAI,OAAe;AACjB,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AACF;","names":[]}
@@ -128,11 +128,9 @@
128
128
 
129
129
 
130
130
 
131
- var _chunkLDKIIVFVcjs = require('../chunk-LDKIIVFV.cjs');
132
- require('../chunk-RFXGG37L.cjs');
131
+ var _chunkCQIZDSBEcjs = require('../chunk-CQIZDSBE.cjs');
132
+ require('../chunk-IV2Z3JLR.cjs');
133
133
  require('../chunk-U2PEBFPU.cjs');
134
- require('../chunk-5QVXRT3A.cjs');
135
- require('../chunk-IFXFOYDU.cjs');
136
134
 
137
135
 
138
136
 
@@ -262,5 +260,5 @@ require('../chunk-IFXFOYDU.cjs');
262
260
 
263
261
 
264
262
 
265
- exports.AppointmentsResource = _chunkLDKIIVFVcjs.AppointmentsResource; exports.AuthenticateResource = _chunkLDKIIVFVcjs.AuthenticateResource; exports.BillingCodesResource = _chunkLDKIIVFVcjs.BillingCodesResource; exports.BillingItemsResource = _chunkLDKIIVFVcjs.BillingItemsResource; exports.ChangeRequestLinksResource = _chunkLDKIIVFVcjs.ChangeRequestLinksResource; exports.ChecklistLibrariesResource = _chunkLDKIIVFVcjs.ChecklistLibrariesResource; exports.ChecklistLibraryChecklistItemsResource = _chunkLDKIIVFVcjs.ChecklistLibraryChecklistItemsResource; exports.ClassificationIconsResource = _chunkLDKIIVFVcjs.ClassificationIconsResource; exports.CompaniesResource = _chunkLDKIIVFVcjs.CompaniesResource; exports.CompanyAlertsResource = _chunkLDKIIVFVcjs.CompanyAlertsResource; exports.CompanyLocationsResource = _chunkLDKIIVFVcjs.CompanyLocationsResource; exports.CompanyNotesResource = _chunkLDKIIVFVcjs.CompanyNotesResource; exports.CompanySiteConfigurationsResource = _chunkLDKIIVFVcjs.CompanySiteConfigurationsResource; exports.CompanyWebhooksResource = _chunkLDKIIVFVcjs.CompanyWebhooksResource; exports.ConfigurationItemBillingProductAssociationsResource = _chunkLDKIIVFVcjs.ConfigurationItemBillingProductAssociationsResource; exports.ConfigurationItemCategoriesResource = _chunkLDKIIVFVcjs.ConfigurationItemCategoriesResource; exports.ConfigurationItemCategoryUdfAssociationsResource = _chunkLDKIIVFVcjs.ConfigurationItemCategoryUdfAssociationsResource; exports.ConfigurationItemDnsRecordsResource = _chunkLDKIIVFVcjs.ConfigurationItemDnsRecordsResource; exports.ConfigurationItemNotesResource = _chunkLDKIIVFVcjs.ConfigurationItemNotesResource; exports.ConfigurationItemRelatedItemsResource = _chunkLDKIIVFVcjs.ConfigurationItemRelatedItemsResource; exports.ConfigurationItemSslSubjectAlternativeNamesResource = _chunkLDKIIVFVcjs.ConfigurationItemSslSubjectAlternativeNamesResource; exports.ConfigurationItemTypesResource = _chunkLDKIIVFVcjs.ConfigurationItemTypesResource; exports.ConfigurationItemWebhooksResource = _chunkLDKIIVFVcjs.ConfigurationItemWebhooksResource; exports.ConfigurationItemsResource = _chunkLDKIIVFVcjs.ConfigurationItemsResource; exports.ContactGroupContactsResource = _chunkLDKIIVFVcjs.ContactGroupContactsResource; exports.ContactGroupsResource = _chunkLDKIIVFVcjs.ContactGroupsResource; exports.ContactWebhooksResource = _chunkLDKIIVFVcjs.ContactWebhooksResource; exports.ContactsResource = _chunkLDKIIVFVcjs.ContactsResource; exports.ContractBillingRulesResource = _chunkLDKIIVFVcjs.ContractBillingRulesResource; exports.ContractBlockHourFactorsResource = _chunkLDKIIVFVcjs.ContractBlockHourFactorsResource; exports.ContractBlocksResource = _chunkLDKIIVFVcjs.ContractBlocksResource; exports.ContractChargesResource = _chunkLDKIIVFVcjs.ContractChargesResource; exports.ContractExclusionBillingCodesResource = _chunkLDKIIVFVcjs.ContractExclusionBillingCodesResource; exports.ContractExclusionRolesResource = _chunkLDKIIVFVcjs.ContractExclusionRolesResource; exports.ContractExclusionSetExcludedRolesResource = _chunkLDKIIVFVcjs.ContractExclusionSetExcludedRolesResource; exports.ContractExclusionSetExcludedWorkTypesResource = _chunkLDKIIVFVcjs.ContractExclusionSetExcludedWorkTypesResource; exports.ContractExclusionSetsResource = _chunkLDKIIVFVcjs.ContractExclusionSetsResource; exports.ContractMilestonesResource = _chunkLDKIIVFVcjs.ContractMilestonesResource; exports.ContractNotesResource = _chunkLDKIIVFVcjs.ContractNotesResource; exports.ContractRatesResource = _chunkLDKIIVFVcjs.ContractRatesResource; exports.ContractRetainersResource = _chunkLDKIIVFVcjs.ContractRetainersResource; exports.ContractRoleCostsResource = _chunkLDKIIVFVcjs.ContractRoleCostsResource; exports.ContractServiceAdjustmentsResource = _chunkLDKIIVFVcjs.ContractServiceAdjustmentsResource; exports.ContractServiceBundleAdjustmentsResource = _chunkLDKIIVFVcjs.ContractServiceBundleAdjustmentsResource; exports.ContractServiceBundleUnitsResource = _chunkLDKIIVFVcjs.ContractServiceBundleUnitsResource; exports.ContractServiceBundlesResource = _chunkLDKIIVFVcjs.ContractServiceBundlesResource; exports.ContractServiceUnitsResource = _chunkLDKIIVFVcjs.ContractServiceUnitsResource; exports.ContractServicesResource = _chunkLDKIIVFVcjs.ContractServicesResource; exports.ContractTicketPurchasesResource = _chunkLDKIIVFVcjs.ContractTicketPurchasesResource; exports.ContractsResource = _chunkLDKIIVFVcjs.ContractsResource; exports.CountriesResource = _chunkLDKIIVFVcjs.CountriesResource; exports.DepartmentsResource = _chunkLDKIIVFVcjs.DepartmentsResource; exports.DomainRegistrarsResource = _chunkLDKIIVFVcjs.DomainRegistrarsResource; exports.EntityInformationResource = _chunkLDKIIVFVcjs.EntityInformationResource; exports.ExpenseItemAttachmentsResource = _chunkLDKIIVFVcjs.ExpenseItemAttachmentsResource; exports.ExpenseItemsResource = _chunkLDKIIVFVcjs.ExpenseItemsResource; exports.ExpenseReportsResource = _chunkLDKIIVFVcjs.ExpenseReportsResource; exports.HolidaySetsResource = _chunkLDKIIVFVcjs.HolidaySetsResource; exports.HolidaysResource = _chunkLDKIIVFVcjs.HolidaysResource; exports.InventoryProductsResource = _chunkLDKIIVFVcjs.InventoryProductsResource; exports.InvoicesResource = _chunkLDKIIVFVcjs.InvoicesResource; exports.ModulesResource = _chunkLDKIIVFVcjs.ModulesResource; exports.NotificationHistoryResource = _chunkLDKIIVFVcjs.NotificationHistoryResource; exports.OpportunitiesResource = _chunkLDKIIVFVcjs.OpportunitiesResource; exports.OpportunityAttachmentsResource = _chunkLDKIIVFVcjs.OpportunityAttachmentsResource; exports.OpportunityCategoriesResource = _chunkLDKIIVFVcjs.OpportunityCategoriesResource; exports.PhasesResource = _chunkLDKIIVFVcjs.PhasesResource; exports.ProductVendorsResource = _chunkLDKIIVFVcjs.ProductVendorsResource; exports.ProductsResource = _chunkLDKIIVFVcjs.ProductsResource; exports.ProjectChargesResource = _chunkLDKIIVFVcjs.ProjectChargesResource; exports.ProjectNotesResource = _chunkLDKIIVFVcjs.ProjectNotesResource; exports.ProjectsResource = _chunkLDKIIVFVcjs.ProjectsResource; exports.PurchaseApprovalsResource = _chunkLDKIIVFVcjs.PurchaseApprovalsResource; exports.PurchaseOrderItemReceivingResource = _chunkLDKIIVFVcjs.PurchaseOrderItemReceivingResource; exports.PurchaseOrderItemsResource = _chunkLDKIIVFVcjs.PurchaseOrderItemsResource; exports.PurchaseOrdersResource = _chunkLDKIIVFVcjs.PurchaseOrdersResource; exports.QuoteItemsResource = _chunkLDKIIVFVcjs.QuoteItemsResource; exports.QuoteLocationsResource = _chunkLDKIIVFVcjs.QuoteLocationsResource; exports.QuoteTemplatesResource = _chunkLDKIIVFVcjs.QuoteTemplatesResource; exports.QuotesResource = _chunkLDKIIVFVcjs.QuotesResource; exports.ResourceRoleQueuesResource = _chunkLDKIIVFVcjs.ResourceRoleQueuesResource; exports.ResourceRolesResource = _chunkLDKIIVFVcjs.ResourceRolesResource; exports.ResourceSkillsResource = _chunkLDKIIVFVcjs.ResourceSkillsResource; exports.ResourceTimeOffAdditionalResource = _chunkLDKIIVFVcjs.ResourceTimeOffAdditionalResource; exports.ResourceTimeOffApproversResource = _chunkLDKIIVFVcjs.ResourceTimeOffApproversResource; exports.ResourceTimeOffBalancesResource = _chunkLDKIIVFVcjs.ResourceTimeOffBalancesResource; exports.ResourcesResource = _chunkLDKIIVFVcjs.ResourcesResource; exports.RolesResource = _chunkLDKIIVFVcjs.RolesResource; exports.ServiceCallTaskResourcesResource = _chunkLDKIIVFVcjs.ServiceCallTaskResourcesResource; exports.ServiceCallTasksResource = _chunkLDKIIVFVcjs.ServiceCallTasksResource; exports.ServiceCallTicketResourcesResource = _chunkLDKIIVFVcjs.ServiceCallTicketResourcesResource; exports.ServiceCallTicketsResource = _chunkLDKIIVFVcjs.ServiceCallTicketsResource; exports.ServiceCallsResource = _chunkLDKIIVFVcjs.ServiceCallsResource; exports.ServiceLevelAgreementResultsResource = _chunkLDKIIVFVcjs.ServiceLevelAgreementResultsResource; exports.ServicesResource = _chunkLDKIIVFVcjs.ServicesResource; exports.SkillsResource = _chunkLDKIIVFVcjs.SkillsResource; exports.SubscriptionPeriodsResource = _chunkLDKIIVFVcjs.SubscriptionPeriodsResource; exports.SubscriptionsResource = _chunkLDKIIVFVcjs.SubscriptionsResource; exports.SurveyResultsResource = _chunkLDKIIVFVcjs.SurveyResultsResource; exports.SurveysResource = _chunkLDKIIVFVcjs.SurveysResource; exports.TagAliasesResource = _chunkLDKIIVFVcjs.TagAliasesResource; exports.TagGroupsResource = _chunkLDKIIVFVcjs.TagGroupsResource; exports.TagsResource = _chunkLDKIIVFVcjs.TagsResource; exports.TaskSecondaryResourcesResource = _chunkLDKIIVFVcjs.TaskSecondaryResourcesResource; exports.TasksResource = _chunkLDKIIVFVcjs.TasksResource; exports.ThresholdInformationResource = _chunkLDKIIVFVcjs.ThresholdInformationResource; exports.TicketAdditionalConfigurationItemsResource = _chunkLDKIIVFVcjs.TicketAdditionalConfigurationItemsResource; exports.TicketAdditionalContactsResource = _chunkLDKIIVFVcjs.TicketAdditionalContactsResource; exports.TicketAttachmentsResource = _chunkLDKIIVFVcjs.TicketAttachmentsResource; exports.TicketCategoriesResource = _chunkLDKIIVFVcjs.TicketCategoriesResource; exports.TicketCategoryFieldDefaultsResource = _chunkLDKIIVFVcjs.TicketCategoryFieldDefaultsResource; exports.TicketChangeRequestApprovalsResource = _chunkLDKIIVFVcjs.TicketChangeRequestApprovalsResource; exports.TicketChargesResource = _chunkLDKIIVFVcjs.TicketChargesResource; exports.TicketChecklistItemsResource = _chunkLDKIIVFVcjs.TicketChecklistItemsResource; exports.TicketChecklistLibrariesResource = _chunkLDKIIVFVcjs.TicketChecklistLibrariesResource; exports.TicketHistoryResource = _chunkLDKIIVFVcjs.TicketHistoryResource; exports.TicketNoteAttachmentsResource = _chunkLDKIIVFVcjs.TicketNoteAttachmentsResource; exports.TicketNoteWebhooksResource = _chunkLDKIIVFVcjs.TicketNoteWebhooksResource; exports.TicketNotesResource = _chunkLDKIIVFVcjs.TicketNotesResource; exports.TicketSecondaryResourcesResource = _chunkLDKIIVFVcjs.TicketSecondaryResourcesResource; exports.TicketWebhooksResource = _chunkLDKIIVFVcjs.TicketWebhooksResource; exports.TicketsResource = _chunkLDKIIVFVcjs.TicketsResource; exports.TimeEntriesResource = _chunkLDKIIVFVcjs.TimeEntriesResource; exports.TimeEntryAttachmentsResource = _chunkLDKIIVFVcjs.TimeEntryAttachmentsResource; exports.TimeOffRequestsResource = _chunkLDKIIVFVcjs.TimeOffRequestsResource; exports.VersionInformationResource = _chunkLDKIIVFVcjs.VersionInformationResource; exports.VersionResource = _chunkLDKIIVFVcjs.VersionResource; exports.ZoneInformationResource = _chunkLDKIIVFVcjs.ZoneInformationResource;
263
+ exports.AppointmentsResource = _chunkCQIZDSBEcjs.AppointmentsResource; exports.AuthenticateResource = _chunkCQIZDSBEcjs.AuthenticateResource; exports.BillingCodesResource = _chunkCQIZDSBEcjs.BillingCodesResource; exports.BillingItemsResource = _chunkCQIZDSBEcjs.BillingItemsResource; exports.ChangeRequestLinksResource = _chunkCQIZDSBEcjs.ChangeRequestLinksResource; exports.ChecklistLibrariesResource = _chunkCQIZDSBEcjs.ChecklistLibrariesResource; exports.ChecklistLibraryChecklistItemsResource = _chunkCQIZDSBEcjs.ChecklistLibraryChecklistItemsResource; exports.ClassificationIconsResource = _chunkCQIZDSBEcjs.ClassificationIconsResource; exports.CompaniesResource = _chunkCQIZDSBEcjs.CompaniesResource; exports.CompanyAlertsResource = _chunkCQIZDSBEcjs.CompanyAlertsResource; exports.CompanyLocationsResource = _chunkCQIZDSBEcjs.CompanyLocationsResource; exports.CompanyNotesResource = _chunkCQIZDSBEcjs.CompanyNotesResource; exports.CompanySiteConfigurationsResource = _chunkCQIZDSBEcjs.CompanySiteConfigurationsResource; exports.CompanyWebhooksResource = _chunkCQIZDSBEcjs.CompanyWebhooksResource; exports.ConfigurationItemBillingProductAssociationsResource = _chunkCQIZDSBEcjs.ConfigurationItemBillingProductAssociationsResource; exports.ConfigurationItemCategoriesResource = _chunkCQIZDSBEcjs.ConfigurationItemCategoriesResource; exports.ConfigurationItemCategoryUdfAssociationsResource = _chunkCQIZDSBEcjs.ConfigurationItemCategoryUdfAssociationsResource; exports.ConfigurationItemDnsRecordsResource = _chunkCQIZDSBEcjs.ConfigurationItemDnsRecordsResource; exports.ConfigurationItemNotesResource = _chunkCQIZDSBEcjs.ConfigurationItemNotesResource; exports.ConfigurationItemRelatedItemsResource = _chunkCQIZDSBEcjs.ConfigurationItemRelatedItemsResource; exports.ConfigurationItemSslSubjectAlternativeNamesResource = _chunkCQIZDSBEcjs.ConfigurationItemSslSubjectAlternativeNamesResource; exports.ConfigurationItemTypesResource = _chunkCQIZDSBEcjs.ConfigurationItemTypesResource; exports.ConfigurationItemWebhooksResource = _chunkCQIZDSBEcjs.ConfigurationItemWebhooksResource; exports.ConfigurationItemsResource = _chunkCQIZDSBEcjs.ConfigurationItemsResource; exports.ContactGroupContactsResource = _chunkCQIZDSBEcjs.ContactGroupContactsResource; exports.ContactGroupsResource = _chunkCQIZDSBEcjs.ContactGroupsResource; exports.ContactWebhooksResource = _chunkCQIZDSBEcjs.ContactWebhooksResource; exports.ContactsResource = _chunkCQIZDSBEcjs.ContactsResource; exports.ContractBillingRulesResource = _chunkCQIZDSBEcjs.ContractBillingRulesResource; exports.ContractBlockHourFactorsResource = _chunkCQIZDSBEcjs.ContractBlockHourFactorsResource; exports.ContractBlocksResource = _chunkCQIZDSBEcjs.ContractBlocksResource; exports.ContractChargesResource = _chunkCQIZDSBEcjs.ContractChargesResource; exports.ContractExclusionBillingCodesResource = _chunkCQIZDSBEcjs.ContractExclusionBillingCodesResource; exports.ContractExclusionRolesResource = _chunkCQIZDSBEcjs.ContractExclusionRolesResource; exports.ContractExclusionSetExcludedRolesResource = _chunkCQIZDSBEcjs.ContractExclusionSetExcludedRolesResource; exports.ContractExclusionSetExcludedWorkTypesResource = _chunkCQIZDSBEcjs.ContractExclusionSetExcludedWorkTypesResource; exports.ContractExclusionSetsResource = _chunkCQIZDSBEcjs.ContractExclusionSetsResource; exports.ContractMilestonesResource = _chunkCQIZDSBEcjs.ContractMilestonesResource; exports.ContractNotesResource = _chunkCQIZDSBEcjs.ContractNotesResource; exports.ContractRatesResource = _chunkCQIZDSBEcjs.ContractRatesResource; exports.ContractRetainersResource = _chunkCQIZDSBEcjs.ContractRetainersResource; exports.ContractRoleCostsResource = _chunkCQIZDSBEcjs.ContractRoleCostsResource; exports.ContractServiceAdjustmentsResource = _chunkCQIZDSBEcjs.ContractServiceAdjustmentsResource; exports.ContractServiceBundleAdjustmentsResource = _chunkCQIZDSBEcjs.ContractServiceBundleAdjustmentsResource; exports.ContractServiceBundleUnitsResource = _chunkCQIZDSBEcjs.ContractServiceBundleUnitsResource; exports.ContractServiceBundlesResource = _chunkCQIZDSBEcjs.ContractServiceBundlesResource; exports.ContractServiceUnitsResource = _chunkCQIZDSBEcjs.ContractServiceUnitsResource; exports.ContractServicesResource = _chunkCQIZDSBEcjs.ContractServicesResource; exports.ContractTicketPurchasesResource = _chunkCQIZDSBEcjs.ContractTicketPurchasesResource; exports.ContractsResource = _chunkCQIZDSBEcjs.ContractsResource; exports.CountriesResource = _chunkCQIZDSBEcjs.CountriesResource; exports.DepartmentsResource = _chunkCQIZDSBEcjs.DepartmentsResource; exports.DomainRegistrarsResource = _chunkCQIZDSBEcjs.DomainRegistrarsResource; exports.EntityInformationResource = _chunkCQIZDSBEcjs.EntityInformationResource; exports.ExpenseItemAttachmentsResource = _chunkCQIZDSBEcjs.ExpenseItemAttachmentsResource; exports.ExpenseItemsResource = _chunkCQIZDSBEcjs.ExpenseItemsResource; exports.ExpenseReportsResource = _chunkCQIZDSBEcjs.ExpenseReportsResource; exports.HolidaySetsResource = _chunkCQIZDSBEcjs.HolidaySetsResource; exports.HolidaysResource = _chunkCQIZDSBEcjs.HolidaysResource; exports.InventoryProductsResource = _chunkCQIZDSBEcjs.InventoryProductsResource; exports.InvoicesResource = _chunkCQIZDSBEcjs.InvoicesResource; exports.ModulesResource = _chunkCQIZDSBEcjs.ModulesResource; exports.NotificationHistoryResource = _chunkCQIZDSBEcjs.NotificationHistoryResource; exports.OpportunitiesResource = _chunkCQIZDSBEcjs.OpportunitiesResource; exports.OpportunityAttachmentsResource = _chunkCQIZDSBEcjs.OpportunityAttachmentsResource; exports.OpportunityCategoriesResource = _chunkCQIZDSBEcjs.OpportunityCategoriesResource; exports.PhasesResource = _chunkCQIZDSBEcjs.PhasesResource; exports.ProductVendorsResource = _chunkCQIZDSBEcjs.ProductVendorsResource; exports.ProductsResource = _chunkCQIZDSBEcjs.ProductsResource; exports.ProjectChargesResource = _chunkCQIZDSBEcjs.ProjectChargesResource; exports.ProjectNotesResource = _chunkCQIZDSBEcjs.ProjectNotesResource; exports.ProjectsResource = _chunkCQIZDSBEcjs.ProjectsResource; exports.PurchaseApprovalsResource = _chunkCQIZDSBEcjs.PurchaseApprovalsResource; exports.PurchaseOrderItemReceivingResource = _chunkCQIZDSBEcjs.PurchaseOrderItemReceivingResource; exports.PurchaseOrderItemsResource = _chunkCQIZDSBEcjs.PurchaseOrderItemsResource; exports.PurchaseOrdersResource = _chunkCQIZDSBEcjs.PurchaseOrdersResource; exports.QuoteItemsResource = _chunkCQIZDSBEcjs.QuoteItemsResource; exports.QuoteLocationsResource = _chunkCQIZDSBEcjs.QuoteLocationsResource; exports.QuoteTemplatesResource = _chunkCQIZDSBEcjs.QuoteTemplatesResource; exports.QuotesResource = _chunkCQIZDSBEcjs.QuotesResource; exports.ResourceRoleQueuesResource = _chunkCQIZDSBEcjs.ResourceRoleQueuesResource; exports.ResourceRolesResource = _chunkCQIZDSBEcjs.ResourceRolesResource; exports.ResourceSkillsResource = _chunkCQIZDSBEcjs.ResourceSkillsResource; exports.ResourceTimeOffAdditionalResource = _chunkCQIZDSBEcjs.ResourceTimeOffAdditionalResource; exports.ResourceTimeOffApproversResource = _chunkCQIZDSBEcjs.ResourceTimeOffApproversResource; exports.ResourceTimeOffBalancesResource = _chunkCQIZDSBEcjs.ResourceTimeOffBalancesResource; exports.ResourcesResource = _chunkCQIZDSBEcjs.ResourcesResource; exports.RolesResource = _chunkCQIZDSBEcjs.RolesResource; exports.ServiceCallTaskResourcesResource = _chunkCQIZDSBEcjs.ServiceCallTaskResourcesResource; exports.ServiceCallTasksResource = _chunkCQIZDSBEcjs.ServiceCallTasksResource; exports.ServiceCallTicketResourcesResource = _chunkCQIZDSBEcjs.ServiceCallTicketResourcesResource; exports.ServiceCallTicketsResource = _chunkCQIZDSBEcjs.ServiceCallTicketsResource; exports.ServiceCallsResource = _chunkCQIZDSBEcjs.ServiceCallsResource; exports.ServiceLevelAgreementResultsResource = _chunkCQIZDSBEcjs.ServiceLevelAgreementResultsResource; exports.ServicesResource = _chunkCQIZDSBEcjs.ServicesResource; exports.SkillsResource = _chunkCQIZDSBEcjs.SkillsResource; exports.SubscriptionPeriodsResource = _chunkCQIZDSBEcjs.SubscriptionPeriodsResource; exports.SubscriptionsResource = _chunkCQIZDSBEcjs.SubscriptionsResource; exports.SurveyResultsResource = _chunkCQIZDSBEcjs.SurveyResultsResource; exports.SurveysResource = _chunkCQIZDSBEcjs.SurveysResource; exports.TagAliasesResource = _chunkCQIZDSBEcjs.TagAliasesResource; exports.TagGroupsResource = _chunkCQIZDSBEcjs.TagGroupsResource; exports.TagsResource = _chunkCQIZDSBEcjs.TagsResource; exports.TaskSecondaryResourcesResource = _chunkCQIZDSBEcjs.TaskSecondaryResourcesResource; exports.TasksResource = _chunkCQIZDSBEcjs.TasksResource; exports.ThresholdInformationResource = _chunkCQIZDSBEcjs.ThresholdInformationResource; exports.TicketAdditionalConfigurationItemsResource = _chunkCQIZDSBEcjs.TicketAdditionalConfigurationItemsResource; exports.TicketAdditionalContactsResource = _chunkCQIZDSBEcjs.TicketAdditionalContactsResource; exports.TicketAttachmentsResource = _chunkCQIZDSBEcjs.TicketAttachmentsResource; exports.TicketCategoriesResource = _chunkCQIZDSBEcjs.TicketCategoriesResource; exports.TicketCategoryFieldDefaultsResource = _chunkCQIZDSBEcjs.TicketCategoryFieldDefaultsResource; exports.TicketChangeRequestApprovalsResource = _chunkCQIZDSBEcjs.TicketChangeRequestApprovalsResource; exports.TicketChargesResource = _chunkCQIZDSBEcjs.TicketChargesResource; exports.TicketChecklistItemsResource = _chunkCQIZDSBEcjs.TicketChecklistItemsResource; exports.TicketChecklistLibrariesResource = _chunkCQIZDSBEcjs.TicketChecklistLibrariesResource; exports.TicketHistoryResource = _chunkCQIZDSBEcjs.TicketHistoryResource; exports.TicketNoteAttachmentsResource = _chunkCQIZDSBEcjs.TicketNoteAttachmentsResource; exports.TicketNoteWebhooksResource = _chunkCQIZDSBEcjs.TicketNoteWebhooksResource; exports.TicketNotesResource = _chunkCQIZDSBEcjs.TicketNotesResource; exports.TicketSecondaryResourcesResource = _chunkCQIZDSBEcjs.TicketSecondaryResourcesResource; exports.TicketWebhooksResource = _chunkCQIZDSBEcjs.TicketWebhooksResource; exports.TicketsResource = _chunkCQIZDSBEcjs.TicketsResource; exports.TimeEntriesResource = _chunkCQIZDSBEcjs.TimeEntriesResource; exports.TimeEntryAttachmentsResource = _chunkCQIZDSBEcjs.TimeEntryAttachmentsResource; exports.TimeOffRequestsResource = _chunkCQIZDSBEcjs.TimeOffRequestsResource; exports.VersionInformationResource = _chunkCQIZDSBEcjs.VersionInformationResource; exports.VersionResource = _chunkCQIZDSBEcjs.VersionResource; exports.ZoneInformationResource = _chunkCQIZDSBEcjs.ZoneInformationResource;
266
264
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/maxs/gitrepos/node-autotask/dist/resources/index.cjs"],"names":[],"mappings":"AAAA,0GAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,2vUAAC","file":"/Users/maxs/gitrepos/node-autotask/dist/resources/index.cjs"}
1
+ {"version":3,"sources":["/Users/maxs/gitrepos/node-autotask/dist/resources/index.cjs"],"names":[],"mappings":"AAAA,0GAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,2vUAAC","file":"/Users/maxs/gitrepos/node-autotask/dist/resources/index.cjs"}
@@ -128,11 +128,9 @@ import {
128
128
  VersionInformationResource,
129
129
  VersionResource,
130
130
  ZoneInformationResource
131
- } from "../chunk-C7U3ZRRK.js";
132
- import "../chunk-GNS47RBV.js";
131
+ } from "../chunk-2QLOK7PX.js";
132
+ import "../chunk-IUJJPWUX.js";
133
133
  import "../chunk-LBNDOP4A.js";
134
- import "../chunk-FE225M76.js";
135
- import "../chunk-QF4K3XTK.js";
136
134
  export {
137
135
  AppointmentsResource,
138
136
  AuthenticateResource,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-autotask",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "Fully-typed TypeScript SDK for the Autotask (Datto) PSA REST API. Zero runtime dependencies. Built for building MCP servers and integrations.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -112,7 +112,7 @@
112
112
  "coverage": "vitest run --coverage",
113
113
  "lint": "eslint src test",
114
114
  "lint:fix": "eslint src test --fix",
115
- "verify": "npm run typecheck && npm run lint && npm run build && node scripts/check-capabilities.mjs --ship && npm run mcp:project:check && npm run catalog:check && npm run mcp:check-surface && npm run public-surface && npm test",
115
+ "verify": "npm run typecheck && npm run lint && npm run build && node scripts/check-capabilities.mjs --ship && npm run mcp:project:check && npm run n8n:project:check && npm run catalog:check && npm run mcp:check-surface && npm run public-surface && npm run verify:pack && npm test",
116
116
  "plan:derive": "node scripts/derive-plan.mjs",
117
117
  "capabilities:build": "node scripts/generate-capabilities.mjs",
118
118
  "capabilities:check": "node scripts/check-capabilities.mjs",
@@ -127,7 +127,13 @@
127
127
  "docs:render": "node scripts/render-docs.mjs",
128
128
  "mcp:check-surface": "node scripts/check-mcp-surface.mjs",
129
129
  "n8n:project": "node scripts/project-n8n-mcp.mjs",
130
- "n8n:project:check": "node scripts/project-n8n-mcp.mjs --check"
130
+ "n8n:project:check": "node scripts/project-n8n-mcp.mjs --check",
131
+ "verify:pack": "node scripts/verify-pack.mjs",
132
+ "capabilities:check:ship": "node scripts/check-capabilities.mjs --ship",
133
+ "prepack": "npm run build",
134
+ "prepublishOnly": "npm run clean && npm run verify && npm run capabilities:check:ship",
135
+ "worktree:setup": "node scripts/worktree-setup.mjs",
136
+ "worktree:remove": "node scripts/worktree-remove.mjs"
131
137
  },
132
138
  "keywords": [
133
139
  "autotask",