node-autotask 0.33.0 → 0.37.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 (41) hide show
  1. package/CHANGELOG.md +82 -1
  2. package/MCP_TOOL_CATALOG.json +26 -9
  3. package/MCP_TOOL_MANIFEST.md +14 -13
  4. package/N8N_MCP_MANIFEST.json +5 -5
  5. package/N8N_MCP_MANIFEST.md +4 -4
  6. package/README.md +12 -5
  7. package/capabilities.json +5850 -2557
  8. package/capabilities.schema.json +36 -0
  9. package/dist/capabilities.cjs +2 -2
  10. package/dist/capabilities.d.cts +15 -1
  11. package/dist/capabilities.d.ts +15 -1
  12. package/dist/capabilities.js +1 -1
  13. package/dist/{chunk-7WNE5MPG.js → chunk-2PJCQGXZ.js} +12 -12
  14. package/dist/{chunk-OO67MRHN.cjs → chunk-4GHBN2AW.cjs} +1737 -6620
  15. package/dist/{chunk-5DS6F6GF.js → chunk-75WJS26D.js} +3594 -8477
  16. package/dist/{chunk-3LAZZT7V.cjs → chunk-7WR5WUQT.cjs} +143 -143
  17. package/dist/{chunk-MFDQHFGJ.js → chunk-CH2WXTYD.js} +9445 -3678
  18. package/dist/{chunk-4QN43TRP.cjs → chunk-FYF46OT3.cjs} +9470 -3703
  19. package/dist/{chunk-SP2SJJZX.cjs → chunk-HBYKTXN3.cjs} +5849 -2556
  20. package/dist/{chunk-VKE56TTN.js → chunk-KQ6HMBB4.js} +5849 -2556
  21. package/dist/{index-BaeMHZPk.d.ts → index-DAFg_68I.d.ts} +584 -207
  22. package/dist/{index-Cq0VsfSz.d.cts → index-g8J6Qiu1.d.cts} +584 -207
  23. package/dist/index.cjs +22 -22
  24. package/dist/index.d.cts +2 -2
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +14 -14
  27. package/dist/operations/index.cjs +867 -135
  28. package/dist/operations/index.d.cts +182 -28
  29. package/dist/operations/index.d.ts +182 -28
  30. package/dist/operations/index.js +742 -10
  31. package/dist/pool.cjs +9 -9
  32. package/dist/pool.d.cts +1 -1
  33. package/dist/pool.d.ts +1 -1
  34. package/dist/pool.js +4 -4
  35. package/dist/resources/index.cjs +5 -4
  36. package/dist/resources/index.d.cts +1 -1
  37. package/dist/resources/index.d.ts +1 -1
  38. package/dist/resources/index.js +14 -13
  39. package/docs/API.md +481 -46
  40. package/docs/LIVE-TESTING.md +11 -11
  41. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import { a as AutotaskClient, ev as BlindSurfaceInfo, ew as RelationshipResource, ex as BlindSurfaceInventory, ey as BlindSurfaceRow, ez as CreateGuidanceRow, eA as CreateBlockerKind, eB as CreateGuidanceReport, Z as ZoneName, eC as FieldCacheKind, k as AutotaskConfigError } from '../index-Cq0VsfSz.cjs';
2
- export { eD as FIELD_CACHE_KINDS } from '../index-Cq0VsfSz.cjs';
1
+ import { a as AutotaskClient, eF as BlindSurfaceInfo, eG as RelationshipResource, eH as BlindSurfaceInventory, eI as BlindSurfaceRow, eJ as CreateGuidanceValueRequirement, eK as CreateGuidanceRow, eL as CreateBlockerKind, eM as CreateGuidanceReport, Z as ZoneName, eN as FieldCacheKind, k as AutotaskConfigError } from '../index-g8J6Qiu1.cjs';
2
+ export { eO as FIELD_CACHE_KINDS } from '../index-g8J6Qiu1.cjs';
3
3
  import { I as Identifier, cX as EmptyReasonInfo, e9 as PickListValue, a as FilterCondition } from '../index-m-7fOwFl.cjs';
4
4
  export { hV as PICKLIST_VALUE_NOT_SERVED_NOTE } from '../index-m-7fOwFl.cjs';
5
5
  import { CapabilityRecord } from '../capabilities.cjs';
@@ -138,6 +138,13 @@ interface InvokeOptions {
138
138
  * under `dryRun: true` (no wire).
139
139
  */
140
140
  maxRetries?: number;
141
+ /**
142
+ * Issue #250: `true` makes a single-record `<resource>.get` bypass the read
143
+ * cache lookup and refresh the entry with the live response (a read-back
144
+ * after a write made elsewhere). Honoured ONLY on a `get` read; any other
145
+ * operation refuses it pre-request. Omitted/`false` = the cached default.
146
+ */
147
+ fresh?: boolean;
141
148
  }
142
149
 
143
150
  declare function searchAcrossResources(client: AutotaskClient, query: string, opts?: SearchAcrossResourcesOptions): Promise<SearchAcrossResourcesResult>;
@@ -280,6 +287,146 @@ interface AggregateResult {
280
287
  */
281
288
  declare function aggregate(client: AutotaskClient, operation: string, filter: unknown, opts?: AggregateOptions): Promise<AggregateResult>;
282
289
 
290
+ type RevenueRollupDimension = 'vertical' | 'contractType' | 'contractCategory' | 'company' | 'month' | 'billingItemKind' | 'contract' | 'lineOfBusiness' | 'resource' | 'billingCode';
291
+ /** The closed opts bag. Exactly one scope key is required. */
292
+ interface RevenueRollupOptions {
293
+ companyIDs?: number[];
294
+ /** `companies.ownerResourceID`, resolved to company ids (one projected query) before the walk. */
295
+ ownerResourceID?: number;
296
+ contractIDs?: number[];
297
+ tenantWide?: true;
298
+ /** 'YYYY-MM-DD', inclusive. */
299
+ dateFrom: string;
300
+ /** 'YYYY-MM-DD', inclusive; window ≤ 36 months. */
301
+ dateTo: string;
302
+ /** Ids or labels; default = the live labels that START with 'Recurring' or 'Fixed' (case-insensitive). */
303
+ contractTypes?: Array<number | string>;
304
+ contractCategories?: Array<number | string>;
305
+ /** Default ['vertical', 'contractType']. */
306
+ groupBy?: RevenueRollupDimension[];
307
+ /** Rows kept (default 100, cap 100); the tail folds into `rowsTruncated`. */
308
+ top?: number;
309
+ /** Vendor-call budget (default 90, or 150 with includeNonChargeable; cap 200). */
310
+ maxVendorCalls?: number;
311
+ /** Add per-row non-chargeable work (contract-covered and non-billable: value + hours), never added to revenue. Default false. */
312
+ includeNonChargeable?: boolean;
313
+ }
314
+ /** A dimension value: picklist text in `label`, vendor entity text (untrusted) in `name` (and, for lineOfBusiness, `division`). */
315
+ interface RevenueRollupKey {
316
+ id: number | string | null;
317
+ label?: string;
318
+ name?: string;
319
+ division?: string;
320
+ }
321
+ interface RevenueRollupAmount {
322
+ amount: number;
323
+ lines: number;
324
+ }
325
+ /** Non-chargeable work: Σ internalCurrencyExtendedPrice (`value`), Σ quantity on labour lines (`hours`), line count. */
326
+ interface RevenueRollupNonChargeableAmount {
327
+ value: number;
328
+ hours: number;
329
+ lines: number;
330
+ }
331
+ interface RevenueRollupNonChargeable {
332
+ contractCovered: RevenueRollupNonChargeableAmount;
333
+ nonBillable: RevenueRollupNonChargeableAmount;
334
+ }
335
+ interface RevenueRollupRow {
336
+ keys: Partial<Record<RevenueRollupDimension, RevenueRollupKey>>;
337
+ revenue: number;
338
+ credits: RevenueRollupAmount;
339
+ includedValue: number;
340
+ contracts: number;
341
+ items: number;
342
+ /** Only with includeNonChargeable; never part of `revenue`. */
343
+ nonChargeable?: RevenueRollupNonChargeable;
344
+ }
345
+ interface RevenueRollupResult {
346
+ window: {
347
+ dateFrom: string;
348
+ dateTo: string;
349
+ basis: 'invoiceDate';
350
+ };
351
+ scope: {
352
+ kind: 'companyIDs' | 'ownerResourceID' | 'contractIDs' | 'tenantWide';
353
+ ownerResourceID?: number;
354
+ ids?: number[];
355
+ };
356
+ groupBy: RevenueRollupDimension[];
357
+ top: number;
358
+ rows: RevenueRollupRow[];
359
+ rowsTruncated?: {
360
+ rows: number;
361
+ revenue: number;
362
+ };
363
+ totals: {
364
+ revenue: number;
365
+ credits: number;
366
+ includedValue: number;
367
+ contracts: number;
368
+ items: number;
369
+ nonChargeable?: RevenueRollupNonChargeable;
370
+ };
371
+ coverage: {
372
+ /** Logical vendor requests through the budget wrapper; transport retries (429 / 5xx, up to maxRetries each) are not counted. */
373
+ vendorCalls: number;
374
+ budget: number;
375
+ estimate: number;
376
+ /** vendorCalls as a share of the 10,000/h tenant limit (a floor: transport retries are not counted). */
377
+ tenantHourlyShare: string;
378
+ contractTypeMap: Record<string, string>;
379
+ contractCategoryMap?: Record<string, string>;
380
+ reconciliation: {
381
+ headerTotal: number;
382
+ lineTotal: number;
383
+ delta: number;
384
+ invoicesChecked: number;
385
+ invoicesMismatched: number;
386
+ };
387
+ /** Informational overlay, NOT an excluded bucket: zero-total invoices in scope and their lines (those lines are still folded into rows / the buckets). */
388
+ zeroTotalInvoices: {
389
+ count: number;
390
+ } & RevenueRollupAmount;
391
+ excluded: {
392
+ /** Header figures of the window's voided invoices in scope (company scopes: header companyID in scope). Absent for a contractIDs scope: an invoice header cannot be attributed to a contract. */
393
+ voidedInvoices?: {
394
+ count: number;
395
+ headerAmount: number;
396
+ };
397
+ uncontracted: RevenueRollupAmount;
398
+ otherContractTypes: Record<string, RevenueRollupAmount>;
399
+ otherContractCategories: Record<string, RevenueRollupAmount>;
400
+ unresolvedContracts: RevenueRollupAmount;
401
+ unresolvedCompanies: RevenueRollupAmount;
402
+ /** Only when lineOfBusiness is grouped: a line association (or its level1/level2) the id-in fetch did not return. */
403
+ unresolvedAssociations?: RevenueRollupAmount;
404
+ /** Only when resource is grouped: a labour line's time entry (or its resource) the id-in fetch did not return. */
405
+ unresolvedTimeEntries?: RevenueRollupAmount;
406
+ /** Only when billingCode is grouped: a line billing code the id-in fetch did not return. */
407
+ unresolvedBillingCodes?: RevenueRollupAmount;
408
+ /** Only with includeNonChargeable: invoiced and uninvoiced non-chargeable lines whose row could not be resolved (a contract, company or join miss; amount = Σ value). */
409
+ unresolvedNonChargeable?: RevenueRollupAmount;
410
+ };
411
+ /** Only when lineOfBusiness is grouped: in-scope lines with no LOB pointer (also their own "no LOB assigned" row). */
412
+ lineOfBusiness?: {
413
+ noPointer: RevenueRollupAmount;
414
+ note: string;
415
+ };
416
+ blindSurfaces: string[];
417
+ notes: string[];
418
+ };
419
+ }
420
+ /**
421
+ * `operations.revenueRollup` — see the module header.
422
+ *
423
+ * ```ts
424
+ * import { revenueRollup } from 'node-autotask/operations';
425
+ * const r = await revenueRollup(client, { tenantWide: true, dateFrom: '2025-07-01', dateTo: '2026-06-30' });
426
+ * ```
427
+ */
428
+ declare function revenueRollup(client: AutotaskClient, opts: RevenueRollupOptions): Promise<RevenueRollupResult>;
429
+
283
430
  /** The pinned per-call item cap (total items per call, mixed resources — the issue's "500 ids" budget; over → CONFIG_ERROR pre-request, zero wire). */
284
431
  declare const FETCH_BY_IDS_MAX_ITEMS = 500;
285
432
  /** The pinned `id in` chunk size (250/chunk — the chunk query is a single page: 250 is well under the 500 vendor page max). */
@@ -430,38 +577,42 @@ declare function probeReachability(client: AutotaskClient, opts?: ProbeReachabil
430
577
  * Three sources answer that question, at three different coverages, and the
431
578
  * SDK used to leave the choice to each caller:
432
579
  * 1. `createGuidance.liveProvenPrefix` — the fields a live create actually
433
- * demanded, in vendor-demand order (92 rows; the widest evidence);
434
- * 2. `zoneFacts.createRequiredSet` — the hand-authored zone set (6
435
- * resources);
580
+ * demanded, in vendor-demand order (the widest evidence);
581
+ * 2. `zoneFacts.createRequiredSet` — the hand-authored zone set;
436
582
  * 3. the vendor field catalog's `isRequired` — the spec opinion (wrong for
437
- * 68 of the 75 resources that carry a proven prefix).
583
+ * most resources that carry a proven prefix).
438
584
  *
439
585
  * The order is FIXED and stated: live-proven > zone > spec, with the source
440
586
  * named on the result (`from`). Both plan shapes stay where they are; this
441
587
  * helper is the only place in the SDK that compares them.
442
588
  *
443
- * Value-conditioned prefixes: a prefix proven for one picklist value (e.g.
444
- * `contracts.create`'s type-1 `estimatedRevenue`/`estimatedHours`/
445
- * `estimatedCost`) is still returned whole with `from: 'live-proven'` — the
446
- * condition itself lives on the create-guidance row (`blocker.message` +
447
- * `vendorEvidence`), which a caller must read before treating the list as
448
- * unconditional. Never flatten a conditioned row into "all these fields are
449
- * always required"; the row's evidence is the qualifier.
589
+ * Value-conditioned fields: a field the row gates on a picklist value
590
+ * (`requiresByValue`, e.g. `contracts.create` needs `estimatedHours` only for
591
+ * `contractType` 1) is never returned as unconditionally required. It is
592
+ * removed from `fields`, and the gates are returned, typed, on `conditional`.
593
+ *
594
+ * `unproven` is true when no live create is known to succeed with the
595
+ * returned set: the plan row says the create still failed after the prefix,
596
+ * or the set is only the vendor spec's opinion.
450
597
  */
451
598
 
452
599
  /** Which source the returned field set came from (the precedence order). */
453
600
  type RequiredFieldsSource = 'live-proven' | 'zone' | 'spec';
454
601
  /** The effective required set + the source it came from. */
455
602
  interface EffectiveRequiredFields {
456
- /** The required field names, in the source's own order (vendor-demand order for a live-proven prefix). */
603
+ /** The unconditionally required field names, in the source's own order (vendor-demand order for a live-proven prefix). Fields gated by a value are on `conditional`, not here. */
457
604
  fields: string[];
458
605
  /** `live-proven` (createGuidance.liveProvenPrefix) > `zone` (createRequiredSet) > `spec` (vendor isRequired). */
459
606
  from: RequiredFieldsSource;
607
+ /** True when no live create is known to succeed with this set (the plan row is unproven, or the set is the spec's opinion only). */
608
+ unproven: boolean;
609
+ /** The value-conditioned gates (`createGuidance.requiresByValue`); present only when the row declares some. Their fields are not in `fields`. */
610
+ conditional?: CreateGuidanceValueRequirement[];
460
611
  }
461
612
  /** The plan zone-fact shape this helper reads (both shapes stay plan-owned). */
462
613
  interface RequiredFieldsZoneFacts {
463
614
  createRequiredSet?: string[];
464
- createGuidance?: Pick<CreateGuidanceRow, 'liveProvenPrefix' | 'unproven'> | null;
615
+ createGuidance?: Pick<CreateGuidanceRow, 'liveProvenPrefix' | 'unproven' | 'requiresByValue'> | null;
465
616
  }
466
617
  /** The spec-side record this helper reads (the vendor field catalog's projection). */
467
618
  interface RequiredFieldsRecord {
@@ -477,27 +628,30 @@ interface RequiredFieldsRecord {
477
628
  * { requiredFields: vendorRequiredNames }, // from operations.fieldCatalog
478
629
  * RELATIONSHIP_MAP.contacts.zoneFacts, // the plan zone facts
479
630
  * );
480
- * // contacts: { fields: ['firstName', 'lastName', 'companyID', 'isActive'], from: 'live-proven' }
631
+ * // contacts: { fields: ['firstName', 'lastName', 'companyID', 'isActive'], from: 'live-proven', unproven: false }
481
632
  * ```
482
633
  *
483
634
  * An empty or absent higher source falls through to the next one; with no
484
- * source at all the result is `{ fields: [], from: 'spec' }` — the name of the
485
- * source is always stated, never a bare list.
635
+ * source at all the result is `{ fields: [], from: 'spec', unproven: true }` —
636
+ * the name of the source is always stated, never a bare list.
486
637
  */
487
638
  declare function effectiveRequiredFields(record?: RequiredFieldsRecord | null, zoneFacts?: RequiredFieldsZoneFacts | null): EffectiveRequiredFields;
488
639
 
489
- /** The closed blocker-kind set (the gate re-derives it; unknown kind → CONFIG_ERROR). */
490
640
  /**
491
- * The closed blocker-kind set served by `operations.createGuidance`.
492
- * Superset of issue #12's 8-value enumeration: the campaign decode produced
493
- * 14 rows that matched no named blocker (wall-adjacent create shapes with
494
- * verbatim vendor evidence) — the closed set gained `'unknown'` (9 kinds)
495
- * rather than forcing those rows into a misfitting class.
641
+ * The closed blocker-kind set served by `operations.createGuidance` (the gate
642
+ * re-derives it; an unknown kind is a CONFIG_ERROR on the filter).
643
+ *
644
+ * `'non-mutable'` is a create blocker: the vendor refuses the create write
645
+ * itself for the entity (no row carries it today). `'delete-absent'` is NOT a
646
+ * create blocker — a missing vendor DELETE is `deleteBoundary` — so the kind
647
+ * is reserved and no row carries it (the gate fails a row that does); it
648
+ * stays in the set so existing `kind` filters keep working. `'unknown'`
649
+ * covers wall-adjacent rows that match no named class.
496
650
  */
497
651
  declare const CREATE_BLOCKER_KINDS: readonly CreateBlockerKind[];
498
652
  /** One served create-guidance row: the plan row plus the effective required set (issue #219 N4). */
499
653
  interface ServedCreateGuidanceRow extends CreateGuidanceRow {
500
- /** The effective create-required set + the source it came from (`live-proven` > `zone` > `spec`). Read `blocker`/`vendorEvidence` before treating a value-conditioned prefix as unconditional. */
654
+ /** The effective create-required set + the source it came from (`live-proven` > `zone` > `spec`). `fields` excludes value-gated fields (see `conditional`) and `unproven` says whether a live create is known to succeed with the set. */
501
655
  requiredFields: EffectiveRequiredFields;
502
656
  }
503
657
  /** The served report (the plan report with the effective required set on every row). */
@@ -682,7 +836,7 @@ interface FieldCatalogRow {
682
836
  resource: string;
683
837
  /** The vendor entity name (the path segment; plan-derived). */
684
838
  apiEntity: string;
685
- /** True when the plan carries a `getUdfInfo` row for the resource (the vendor defines a UDF catalog endpoint for every entity resource — the catalog may answer an empty list). */
839
+ /** The plan resource's `udfCapable` flag, read from the registry record (`CapabilityRecord.udfCapable`, issue #254): true for the resources whose records carry `userDefinedFields`. Every vendor entity has a `getUdfInfo` catalog endpoint, so the `udf` include works on any row; that endpoint's presence does not make a resource UDF-capable. */
686
840
  udfCapable: boolean;
687
841
  /** The filter mechanism for a UDF name — present exactly when `udfCapable`: a filter on a UDF name is accepted only with the vendor's `udf: true` marker (a plain filter is refused), so the row states the marker rather than leaving a consumer to read the UDF rows' `isQueryable` (issue #219 N7). */
688
842
  udfFilter?: 'udf-marker';
@@ -745,7 +899,7 @@ interface FieldCatalogResult {
745
899
  resources: number;
746
900
  /** The plan's `getFieldInfo`-bearing resource count (the field-capable set). */
747
901
  fieldCapableResources: number;
748
- /** The plan's `getUdfInfo`-bearing resource count (the vendor defines a UDF catalog endpoint for these; the narrower plan `udfCapable` flag — entities that actually carry UDFs — is a subset). */
902
+ /** The plan's `udfCapable` resource count (issue #254: the resources whose records carry `userDefinedFields` — not the wider set with a `getUdfInfo` catalog endpoint). */
749
903
  udfCapableResources: number;
750
904
  /** The rows served fully from the cache. */
751
905
  cached: number;
@@ -1067,4 +1221,4 @@ declare function invokeWrite(client: AutotaskClient, operation: string, args?: r
1067
1221
  */
1068
1222
  declare function invokeDelete(client: AutotaskClient, operation: string, args?: readonly unknown[] | Record<string, unknown>, opts?: InvokeOptions): Promise<unknown>;
1069
1223
 
1070
- export { AGGREGATE_DATE_BUCKETS, AGGREGATE_DEFAULT_LIMIT, AGGREGATE_DEFAULT_TOP, AGGREGATE_TOP_MAX, type AggregateGroup, type AggregateOptions, type AggregateResult, BLIND_SURFACE_KINDS, type BlindSurfaceKind, type BlindSurfaceOptions, BlindSurfaceRow, CREATE_BLOCKER_KINDS, type CreateGuidanceOptions, type DateBucket, type DerivationRule, ENTITY_TYPE_TO_RESOURCE, EXPAND_RESOURCE_NAMES_MAX_IDS, type EffectiveRequiredFields, type ExpandResourceNameRow, type ExpandResourceNamesOptions, type ExpandResourceNamesResult, FETCH_BY_IDS_CHUNK_SIZE, FETCH_BY_IDS_MAX_ITEMS, FETCH_MANY_MAX_ITEMS, FIELD_CATALOG_HONESTY_NOTE, type FetchByIdsOptions, type FetchManyItem, type FetchManyItemError, type FetchManyItemResult, type FetchManyOptions, type FetchManyResult, FieldCacheKind, type FieldCatalogFieldRow, type FieldCatalogOptions, type FieldCatalogResult, type FieldCatalogRow, type FieldCatalogRowError, type FieldDerivation, INVOKE_OPTION_KEYS, type InvokeMode, type InvokeOptions, MAX_FIELD_CATALOG_WIRE, PARAMS_BAG_KEYS, type ProbeReachabilityOptions, type ProbeReachabilityResult, type ProbeSurfaceRow, RECOVERY_CONFIRM, RECOVERY_DEFAULT_LIMIT, RECOVERY_MAX_LIMIT, type RecoveryDeleteBoundary, type RecoveryInput, type RecoveryMatch, type RecoveryOptions, type RecoveryResult, type RequiredFieldsRecord, type RequiredFieldsSource, type RequiredFieldsZoneFacts, type ResolveAnyOptions, type ResolveAnyResourceOutcome, type ResolveAnyResult, type SearchAcrossResourcesOptions, type SearchAcrossResourcesResult, type SearchAcrossResourcesRow, type ServedCreateGuidanceReport, type ServedCreateGuidanceRow, UI_LINK_ENTITIES, type UiLinkEntity, type UiLinkInput, type UiLinkResult, WORKFLOW_RESOURCES, aggregate, blindSurfaces, buildUiLink, createGuidance, dateBucketLabel, effectiveRequiredFields, expandResourceNames, fetchByIds, fetchMany, fieldCatalog, foldFlattenedOpts, invoke, invokeDelete, invokeRead, invokeWrite, isEnumerableResource, needsConfirmation, probeReachability, recovery, relationshipMap, resolveAny, resourceForEntityType, searchAcrossResources, uiLink, unknownKeysRefusal, validateDispatchArgs, validateFetchManyItems, validateInvokeOptions, validateParamsBag };
1224
+ export { AGGREGATE_DATE_BUCKETS, AGGREGATE_DEFAULT_LIMIT, AGGREGATE_DEFAULT_TOP, AGGREGATE_TOP_MAX, type AggregateGroup, type AggregateOptions, type AggregateResult, BLIND_SURFACE_KINDS, type BlindSurfaceKind, type BlindSurfaceOptions, BlindSurfaceRow, CREATE_BLOCKER_KINDS, type CreateGuidanceOptions, type DateBucket, type DerivationRule, ENTITY_TYPE_TO_RESOURCE, EXPAND_RESOURCE_NAMES_MAX_IDS, type EffectiveRequiredFields, type ExpandResourceNameRow, type ExpandResourceNamesOptions, type ExpandResourceNamesResult, FETCH_BY_IDS_CHUNK_SIZE, FETCH_BY_IDS_MAX_ITEMS, FETCH_MANY_MAX_ITEMS, FIELD_CATALOG_HONESTY_NOTE, type FetchByIdsOptions, type FetchManyItem, type FetchManyItemError, type FetchManyItemResult, type FetchManyOptions, type FetchManyResult, FieldCacheKind, type FieldCatalogFieldRow, type FieldCatalogOptions, type FieldCatalogResult, type FieldCatalogRow, type FieldCatalogRowError, type FieldDerivation, INVOKE_OPTION_KEYS, type InvokeMode, type InvokeOptions, MAX_FIELD_CATALOG_WIRE, PARAMS_BAG_KEYS, type ProbeReachabilityOptions, type ProbeReachabilityResult, type ProbeSurfaceRow, RECOVERY_CONFIRM, RECOVERY_DEFAULT_LIMIT, RECOVERY_MAX_LIMIT, type RecoveryDeleteBoundary, type RecoveryInput, type RecoveryMatch, type RecoveryOptions, type RecoveryResult, type RequiredFieldsRecord, type RequiredFieldsSource, type RequiredFieldsZoneFacts, type ResolveAnyOptions, type ResolveAnyResourceOutcome, type ResolveAnyResult, type RevenueRollupAmount, type RevenueRollupDimension, type RevenueRollupKey, type RevenueRollupNonChargeable, type RevenueRollupNonChargeableAmount, type RevenueRollupOptions, type RevenueRollupResult, type RevenueRollupRow, type SearchAcrossResourcesOptions, type SearchAcrossResourcesResult, type SearchAcrossResourcesRow, type ServedCreateGuidanceReport, type ServedCreateGuidanceRow, UI_LINK_ENTITIES, type UiLinkEntity, type UiLinkInput, type UiLinkResult, WORKFLOW_RESOURCES, aggregate, blindSurfaces, buildUiLink, createGuidance, dateBucketLabel, effectiveRequiredFields, expandResourceNames, fetchByIds, fetchMany, fieldCatalog, foldFlattenedOpts, invoke, invokeDelete, invokeRead, invokeWrite, isEnumerableResource, needsConfirmation, probeReachability, recovery, relationshipMap, resolveAny, resourceForEntityType, revenueRollup, searchAcrossResources, uiLink, unknownKeysRefusal, validateDispatchArgs, validateFetchManyItems, validateInvokeOptions, validateParamsBag };
@@ -1,5 +1,5 @@
1
- import { a as AutotaskClient, ev as BlindSurfaceInfo, ew as RelationshipResource, ex as BlindSurfaceInventory, ey as BlindSurfaceRow, ez as CreateGuidanceRow, eA as CreateBlockerKind, eB as CreateGuidanceReport, Z as ZoneName, eC as FieldCacheKind, k as AutotaskConfigError } from '../index-BaeMHZPk.js';
2
- export { eD as FIELD_CACHE_KINDS } from '../index-BaeMHZPk.js';
1
+ import { a as AutotaskClient, eF as BlindSurfaceInfo, eG as RelationshipResource, eH as BlindSurfaceInventory, eI as BlindSurfaceRow, eJ as CreateGuidanceValueRequirement, eK as CreateGuidanceRow, eL as CreateBlockerKind, eM as CreateGuidanceReport, Z as ZoneName, eN as FieldCacheKind, k as AutotaskConfigError } from '../index-DAFg_68I.js';
2
+ export { eO as FIELD_CACHE_KINDS } from '../index-DAFg_68I.js';
3
3
  import { I as Identifier, cX as EmptyReasonInfo, e9 as PickListValue, a as FilterCondition } from '../index-m-7fOwFl.js';
4
4
  export { hV as PICKLIST_VALUE_NOT_SERVED_NOTE } from '../index-m-7fOwFl.js';
5
5
  import { CapabilityRecord } from '../capabilities.js';
@@ -138,6 +138,13 @@ interface InvokeOptions {
138
138
  * under `dryRun: true` (no wire).
139
139
  */
140
140
  maxRetries?: number;
141
+ /**
142
+ * Issue #250: `true` makes a single-record `<resource>.get` bypass the read
143
+ * cache lookup and refresh the entry with the live response (a read-back
144
+ * after a write made elsewhere). Honoured ONLY on a `get` read; any other
145
+ * operation refuses it pre-request. Omitted/`false` = the cached default.
146
+ */
147
+ fresh?: boolean;
141
148
  }
142
149
 
143
150
  declare function searchAcrossResources(client: AutotaskClient, query: string, opts?: SearchAcrossResourcesOptions): Promise<SearchAcrossResourcesResult>;
@@ -280,6 +287,146 @@ interface AggregateResult {
280
287
  */
281
288
  declare function aggregate(client: AutotaskClient, operation: string, filter: unknown, opts?: AggregateOptions): Promise<AggregateResult>;
282
289
 
290
+ type RevenueRollupDimension = 'vertical' | 'contractType' | 'contractCategory' | 'company' | 'month' | 'billingItemKind' | 'contract' | 'lineOfBusiness' | 'resource' | 'billingCode';
291
+ /** The closed opts bag. Exactly one scope key is required. */
292
+ interface RevenueRollupOptions {
293
+ companyIDs?: number[];
294
+ /** `companies.ownerResourceID`, resolved to company ids (one projected query) before the walk. */
295
+ ownerResourceID?: number;
296
+ contractIDs?: number[];
297
+ tenantWide?: true;
298
+ /** 'YYYY-MM-DD', inclusive. */
299
+ dateFrom: string;
300
+ /** 'YYYY-MM-DD', inclusive; window ≤ 36 months. */
301
+ dateTo: string;
302
+ /** Ids or labels; default = the live labels that START with 'Recurring' or 'Fixed' (case-insensitive). */
303
+ contractTypes?: Array<number | string>;
304
+ contractCategories?: Array<number | string>;
305
+ /** Default ['vertical', 'contractType']. */
306
+ groupBy?: RevenueRollupDimension[];
307
+ /** Rows kept (default 100, cap 100); the tail folds into `rowsTruncated`. */
308
+ top?: number;
309
+ /** Vendor-call budget (default 90, or 150 with includeNonChargeable; cap 200). */
310
+ maxVendorCalls?: number;
311
+ /** Add per-row non-chargeable work (contract-covered and non-billable: value + hours), never added to revenue. Default false. */
312
+ includeNonChargeable?: boolean;
313
+ }
314
+ /** A dimension value: picklist text in `label`, vendor entity text (untrusted) in `name` (and, for lineOfBusiness, `division`). */
315
+ interface RevenueRollupKey {
316
+ id: number | string | null;
317
+ label?: string;
318
+ name?: string;
319
+ division?: string;
320
+ }
321
+ interface RevenueRollupAmount {
322
+ amount: number;
323
+ lines: number;
324
+ }
325
+ /** Non-chargeable work: Σ internalCurrencyExtendedPrice (`value`), Σ quantity on labour lines (`hours`), line count. */
326
+ interface RevenueRollupNonChargeableAmount {
327
+ value: number;
328
+ hours: number;
329
+ lines: number;
330
+ }
331
+ interface RevenueRollupNonChargeable {
332
+ contractCovered: RevenueRollupNonChargeableAmount;
333
+ nonBillable: RevenueRollupNonChargeableAmount;
334
+ }
335
+ interface RevenueRollupRow {
336
+ keys: Partial<Record<RevenueRollupDimension, RevenueRollupKey>>;
337
+ revenue: number;
338
+ credits: RevenueRollupAmount;
339
+ includedValue: number;
340
+ contracts: number;
341
+ items: number;
342
+ /** Only with includeNonChargeable; never part of `revenue`. */
343
+ nonChargeable?: RevenueRollupNonChargeable;
344
+ }
345
+ interface RevenueRollupResult {
346
+ window: {
347
+ dateFrom: string;
348
+ dateTo: string;
349
+ basis: 'invoiceDate';
350
+ };
351
+ scope: {
352
+ kind: 'companyIDs' | 'ownerResourceID' | 'contractIDs' | 'tenantWide';
353
+ ownerResourceID?: number;
354
+ ids?: number[];
355
+ };
356
+ groupBy: RevenueRollupDimension[];
357
+ top: number;
358
+ rows: RevenueRollupRow[];
359
+ rowsTruncated?: {
360
+ rows: number;
361
+ revenue: number;
362
+ };
363
+ totals: {
364
+ revenue: number;
365
+ credits: number;
366
+ includedValue: number;
367
+ contracts: number;
368
+ items: number;
369
+ nonChargeable?: RevenueRollupNonChargeable;
370
+ };
371
+ coverage: {
372
+ /** Logical vendor requests through the budget wrapper; transport retries (429 / 5xx, up to maxRetries each) are not counted. */
373
+ vendorCalls: number;
374
+ budget: number;
375
+ estimate: number;
376
+ /** vendorCalls as a share of the 10,000/h tenant limit (a floor: transport retries are not counted). */
377
+ tenantHourlyShare: string;
378
+ contractTypeMap: Record<string, string>;
379
+ contractCategoryMap?: Record<string, string>;
380
+ reconciliation: {
381
+ headerTotal: number;
382
+ lineTotal: number;
383
+ delta: number;
384
+ invoicesChecked: number;
385
+ invoicesMismatched: number;
386
+ };
387
+ /** Informational overlay, NOT an excluded bucket: zero-total invoices in scope and their lines (those lines are still folded into rows / the buckets). */
388
+ zeroTotalInvoices: {
389
+ count: number;
390
+ } & RevenueRollupAmount;
391
+ excluded: {
392
+ /** Header figures of the window's voided invoices in scope (company scopes: header companyID in scope). Absent for a contractIDs scope: an invoice header cannot be attributed to a contract. */
393
+ voidedInvoices?: {
394
+ count: number;
395
+ headerAmount: number;
396
+ };
397
+ uncontracted: RevenueRollupAmount;
398
+ otherContractTypes: Record<string, RevenueRollupAmount>;
399
+ otherContractCategories: Record<string, RevenueRollupAmount>;
400
+ unresolvedContracts: RevenueRollupAmount;
401
+ unresolvedCompanies: RevenueRollupAmount;
402
+ /** Only when lineOfBusiness is grouped: a line association (or its level1/level2) the id-in fetch did not return. */
403
+ unresolvedAssociations?: RevenueRollupAmount;
404
+ /** Only when resource is grouped: a labour line's time entry (or its resource) the id-in fetch did not return. */
405
+ unresolvedTimeEntries?: RevenueRollupAmount;
406
+ /** Only when billingCode is grouped: a line billing code the id-in fetch did not return. */
407
+ unresolvedBillingCodes?: RevenueRollupAmount;
408
+ /** Only with includeNonChargeable: invoiced and uninvoiced non-chargeable lines whose row could not be resolved (a contract, company or join miss; amount = Σ value). */
409
+ unresolvedNonChargeable?: RevenueRollupAmount;
410
+ };
411
+ /** Only when lineOfBusiness is grouped: in-scope lines with no LOB pointer (also their own "no LOB assigned" row). */
412
+ lineOfBusiness?: {
413
+ noPointer: RevenueRollupAmount;
414
+ note: string;
415
+ };
416
+ blindSurfaces: string[];
417
+ notes: string[];
418
+ };
419
+ }
420
+ /**
421
+ * `operations.revenueRollup` — see the module header.
422
+ *
423
+ * ```ts
424
+ * import { revenueRollup } from 'node-autotask/operations';
425
+ * const r = await revenueRollup(client, { tenantWide: true, dateFrom: '2025-07-01', dateTo: '2026-06-30' });
426
+ * ```
427
+ */
428
+ declare function revenueRollup(client: AutotaskClient, opts: RevenueRollupOptions): Promise<RevenueRollupResult>;
429
+
283
430
  /** The pinned per-call item cap (total items per call, mixed resources — the issue's "500 ids" budget; over → CONFIG_ERROR pre-request, zero wire). */
284
431
  declare const FETCH_BY_IDS_MAX_ITEMS = 500;
285
432
  /** The pinned `id in` chunk size (250/chunk — the chunk query is a single page: 250 is well under the 500 vendor page max). */
@@ -430,38 +577,42 @@ declare function probeReachability(client: AutotaskClient, opts?: ProbeReachabil
430
577
  * Three sources answer that question, at three different coverages, and the
431
578
  * SDK used to leave the choice to each caller:
432
579
  * 1. `createGuidance.liveProvenPrefix` — the fields a live create actually
433
- * demanded, in vendor-demand order (92 rows; the widest evidence);
434
- * 2. `zoneFacts.createRequiredSet` — the hand-authored zone set (6
435
- * resources);
580
+ * demanded, in vendor-demand order (the widest evidence);
581
+ * 2. `zoneFacts.createRequiredSet` — the hand-authored zone set;
436
582
  * 3. the vendor field catalog's `isRequired` — the spec opinion (wrong for
437
- * 68 of the 75 resources that carry a proven prefix).
583
+ * most resources that carry a proven prefix).
438
584
  *
439
585
  * The order is FIXED and stated: live-proven > zone > spec, with the source
440
586
  * named on the result (`from`). Both plan shapes stay where they are; this
441
587
  * helper is the only place in the SDK that compares them.
442
588
  *
443
- * Value-conditioned prefixes: a prefix proven for one picklist value (e.g.
444
- * `contracts.create`'s type-1 `estimatedRevenue`/`estimatedHours`/
445
- * `estimatedCost`) is still returned whole with `from: 'live-proven'` — the
446
- * condition itself lives on the create-guidance row (`blocker.message` +
447
- * `vendorEvidence`), which a caller must read before treating the list as
448
- * unconditional. Never flatten a conditioned row into "all these fields are
449
- * always required"; the row's evidence is the qualifier.
589
+ * Value-conditioned fields: a field the row gates on a picklist value
590
+ * (`requiresByValue`, e.g. `contracts.create` needs `estimatedHours` only for
591
+ * `contractType` 1) is never returned as unconditionally required. It is
592
+ * removed from `fields`, and the gates are returned, typed, on `conditional`.
593
+ *
594
+ * `unproven` is true when no live create is known to succeed with the
595
+ * returned set: the plan row says the create still failed after the prefix,
596
+ * or the set is only the vendor spec's opinion.
450
597
  */
451
598
 
452
599
  /** Which source the returned field set came from (the precedence order). */
453
600
  type RequiredFieldsSource = 'live-proven' | 'zone' | 'spec';
454
601
  /** The effective required set + the source it came from. */
455
602
  interface EffectiveRequiredFields {
456
- /** The required field names, in the source's own order (vendor-demand order for a live-proven prefix). */
603
+ /** The unconditionally required field names, in the source's own order (vendor-demand order for a live-proven prefix). Fields gated by a value are on `conditional`, not here. */
457
604
  fields: string[];
458
605
  /** `live-proven` (createGuidance.liveProvenPrefix) > `zone` (createRequiredSet) > `spec` (vendor isRequired). */
459
606
  from: RequiredFieldsSource;
607
+ /** True when no live create is known to succeed with this set (the plan row is unproven, or the set is the spec's opinion only). */
608
+ unproven: boolean;
609
+ /** The value-conditioned gates (`createGuidance.requiresByValue`); present only when the row declares some. Their fields are not in `fields`. */
610
+ conditional?: CreateGuidanceValueRequirement[];
460
611
  }
461
612
  /** The plan zone-fact shape this helper reads (both shapes stay plan-owned). */
462
613
  interface RequiredFieldsZoneFacts {
463
614
  createRequiredSet?: string[];
464
- createGuidance?: Pick<CreateGuidanceRow, 'liveProvenPrefix' | 'unproven'> | null;
615
+ createGuidance?: Pick<CreateGuidanceRow, 'liveProvenPrefix' | 'unproven' | 'requiresByValue'> | null;
465
616
  }
466
617
  /** The spec-side record this helper reads (the vendor field catalog's projection). */
467
618
  interface RequiredFieldsRecord {
@@ -477,27 +628,30 @@ interface RequiredFieldsRecord {
477
628
  * { requiredFields: vendorRequiredNames }, // from operations.fieldCatalog
478
629
  * RELATIONSHIP_MAP.contacts.zoneFacts, // the plan zone facts
479
630
  * );
480
- * // contacts: { fields: ['firstName', 'lastName', 'companyID', 'isActive'], from: 'live-proven' }
631
+ * // contacts: { fields: ['firstName', 'lastName', 'companyID', 'isActive'], from: 'live-proven', unproven: false }
481
632
  * ```
482
633
  *
483
634
  * An empty or absent higher source falls through to the next one; with no
484
- * source at all the result is `{ fields: [], from: 'spec' }` — the name of the
485
- * source is always stated, never a bare list.
635
+ * source at all the result is `{ fields: [], from: 'spec', unproven: true }` —
636
+ * the name of the source is always stated, never a bare list.
486
637
  */
487
638
  declare function effectiveRequiredFields(record?: RequiredFieldsRecord | null, zoneFacts?: RequiredFieldsZoneFacts | null): EffectiveRequiredFields;
488
639
 
489
- /** The closed blocker-kind set (the gate re-derives it; unknown kind → CONFIG_ERROR). */
490
640
  /**
491
- * The closed blocker-kind set served by `operations.createGuidance`.
492
- * Superset of issue #12's 8-value enumeration: the campaign decode produced
493
- * 14 rows that matched no named blocker (wall-adjacent create shapes with
494
- * verbatim vendor evidence) — the closed set gained `'unknown'` (9 kinds)
495
- * rather than forcing those rows into a misfitting class.
641
+ * The closed blocker-kind set served by `operations.createGuidance` (the gate
642
+ * re-derives it; an unknown kind is a CONFIG_ERROR on the filter).
643
+ *
644
+ * `'non-mutable'` is a create blocker: the vendor refuses the create write
645
+ * itself for the entity (no row carries it today). `'delete-absent'` is NOT a
646
+ * create blocker — a missing vendor DELETE is `deleteBoundary` — so the kind
647
+ * is reserved and no row carries it (the gate fails a row that does); it
648
+ * stays in the set so existing `kind` filters keep working. `'unknown'`
649
+ * covers wall-adjacent rows that match no named class.
496
650
  */
497
651
  declare const CREATE_BLOCKER_KINDS: readonly CreateBlockerKind[];
498
652
  /** One served create-guidance row: the plan row plus the effective required set (issue #219 N4). */
499
653
  interface ServedCreateGuidanceRow extends CreateGuidanceRow {
500
- /** The effective create-required set + the source it came from (`live-proven` > `zone` > `spec`). Read `blocker`/`vendorEvidence` before treating a value-conditioned prefix as unconditional. */
654
+ /** The effective create-required set + the source it came from (`live-proven` > `zone` > `spec`). `fields` excludes value-gated fields (see `conditional`) and `unproven` says whether a live create is known to succeed with the set. */
501
655
  requiredFields: EffectiveRequiredFields;
502
656
  }
503
657
  /** The served report (the plan report with the effective required set on every row). */
@@ -682,7 +836,7 @@ interface FieldCatalogRow {
682
836
  resource: string;
683
837
  /** The vendor entity name (the path segment; plan-derived). */
684
838
  apiEntity: string;
685
- /** True when the plan carries a `getUdfInfo` row for the resource (the vendor defines a UDF catalog endpoint for every entity resource — the catalog may answer an empty list). */
839
+ /** The plan resource's `udfCapable` flag, read from the registry record (`CapabilityRecord.udfCapable`, issue #254): true for the resources whose records carry `userDefinedFields`. Every vendor entity has a `getUdfInfo` catalog endpoint, so the `udf` include works on any row; that endpoint's presence does not make a resource UDF-capable. */
686
840
  udfCapable: boolean;
687
841
  /** The filter mechanism for a UDF name — present exactly when `udfCapable`: a filter on a UDF name is accepted only with the vendor's `udf: true` marker (a plain filter is refused), so the row states the marker rather than leaving a consumer to read the UDF rows' `isQueryable` (issue #219 N7). */
688
842
  udfFilter?: 'udf-marker';
@@ -745,7 +899,7 @@ interface FieldCatalogResult {
745
899
  resources: number;
746
900
  /** The plan's `getFieldInfo`-bearing resource count (the field-capable set). */
747
901
  fieldCapableResources: number;
748
- /** The plan's `getUdfInfo`-bearing resource count (the vendor defines a UDF catalog endpoint for these; the narrower plan `udfCapable` flag — entities that actually carry UDFs — is a subset). */
902
+ /** The plan's `udfCapable` resource count (issue #254: the resources whose records carry `userDefinedFields` — not the wider set with a `getUdfInfo` catalog endpoint). */
749
903
  udfCapableResources: number;
750
904
  /** The rows served fully from the cache. */
751
905
  cached: number;
@@ -1067,4 +1221,4 @@ declare function invokeWrite(client: AutotaskClient, operation: string, args?: r
1067
1221
  */
1068
1222
  declare function invokeDelete(client: AutotaskClient, operation: string, args?: readonly unknown[] | Record<string, unknown>, opts?: InvokeOptions): Promise<unknown>;
1069
1223
 
1070
- export { AGGREGATE_DATE_BUCKETS, AGGREGATE_DEFAULT_LIMIT, AGGREGATE_DEFAULT_TOP, AGGREGATE_TOP_MAX, type AggregateGroup, type AggregateOptions, type AggregateResult, BLIND_SURFACE_KINDS, type BlindSurfaceKind, type BlindSurfaceOptions, BlindSurfaceRow, CREATE_BLOCKER_KINDS, type CreateGuidanceOptions, type DateBucket, type DerivationRule, ENTITY_TYPE_TO_RESOURCE, EXPAND_RESOURCE_NAMES_MAX_IDS, type EffectiveRequiredFields, type ExpandResourceNameRow, type ExpandResourceNamesOptions, type ExpandResourceNamesResult, FETCH_BY_IDS_CHUNK_SIZE, FETCH_BY_IDS_MAX_ITEMS, FETCH_MANY_MAX_ITEMS, FIELD_CATALOG_HONESTY_NOTE, type FetchByIdsOptions, type FetchManyItem, type FetchManyItemError, type FetchManyItemResult, type FetchManyOptions, type FetchManyResult, FieldCacheKind, type FieldCatalogFieldRow, type FieldCatalogOptions, type FieldCatalogResult, type FieldCatalogRow, type FieldCatalogRowError, type FieldDerivation, INVOKE_OPTION_KEYS, type InvokeMode, type InvokeOptions, MAX_FIELD_CATALOG_WIRE, PARAMS_BAG_KEYS, type ProbeReachabilityOptions, type ProbeReachabilityResult, type ProbeSurfaceRow, RECOVERY_CONFIRM, RECOVERY_DEFAULT_LIMIT, RECOVERY_MAX_LIMIT, type RecoveryDeleteBoundary, type RecoveryInput, type RecoveryMatch, type RecoveryOptions, type RecoveryResult, type RequiredFieldsRecord, type RequiredFieldsSource, type RequiredFieldsZoneFacts, type ResolveAnyOptions, type ResolveAnyResourceOutcome, type ResolveAnyResult, type SearchAcrossResourcesOptions, type SearchAcrossResourcesResult, type SearchAcrossResourcesRow, type ServedCreateGuidanceReport, type ServedCreateGuidanceRow, UI_LINK_ENTITIES, type UiLinkEntity, type UiLinkInput, type UiLinkResult, WORKFLOW_RESOURCES, aggregate, blindSurfaces, buildUiLink, createGuidance, dateBucketLabel, effectiveRequiredFields, expandResourceNames, fetchByIds, fetchMany, fieldCatalog, foldFlattenedOpts, invoke, invokeDelete, invokeRead, invokeWrite, isEnumerableResource, needsConfirmation, probeReachability, recovery, relationshipMap, resolveAny, resourceForEntityType, searchAcrossResources, uiLink, unknownKeysRefusal, validateDispatchArgs, validateFetchManyItems, validateInvokeOptions, validateParamsBag };
1224
+ export { AGGREGATE_DATE_BUCKETS, AGGREGATE_DEFAULT_LIMIT, AGGREGATE_DEFAULT_TOP, AGGREGATE_TOP_MAX, type AggregateGroup, type AggregateOptions, type AggregateResult, BLIND_SURFACE_KINDS, type BlindSurfaceKind, type BlindSurfaceOptions, BlindSurfaceRow, CREATE_BLOCKER_KINDS, type CreateGuidanceOptions, type DateBucket, type DerivationRule, ENTITY_TYPE_TO_RESOURCE, EXPAND_RESOURCE_NAMES_MAX_IDS, type EffectiveRequiredFields, type ExpandResourceNameRow, type ExpandResourceNamesOptions, type ExpandResourceNamesResult, FETCH_BY_IDS_CHUNK_SIZE, FETCH_BY_IDS_MAX_ITEMS, FETCH_MANY_MAX_ITEMS, FIELD_CATALOG_HONESTY_NOTE, type FetchByIdsOptions, type FetchManyItem, type FetchManyItemError, type FetchManyItemResult, type FetchManyOptions, type FetchManyResult, FieldCacheKind, type FieldCatalogFieldRow, type FieldCatalogOptions, type FieldCatalogResult, type FieldCatalogRow, type FieldCatalogRowError, type FieldDerivation, INVOKE_OPTION_KEYS, type InvokeMode, type InvokeOptions, MAX_FIELD_CATALOG_WIRE, PARAMS_BAG_KEYS, type ProbeReachabilityOptions, type ProbeReachabilityResult, type ProbeSurfaceRow, RECOVERY_CONFIRM, RECOVERY_DEFAULT_LIMIT, RECOVERY_MAX_LIMIT, type RecoveryDeleteBoundary, type RecoveryInput, type RecoveryMatch, type RecoveryOptions, type RecoveryResult, type RequiredFieldsRecord, type RequiredFieldsSource, type RequiredFieldsZoneFacts, type ResolveAnyOptions, type ResolveAnyResourceOutcome, type ResolveAnyResult, type RevenueRollupAmount, type RevenueRollupDimension, type RevenueRollupKey, type RevenueRollupNonChargeable, type RevenueRollupNonChargeableAmount, type RevenueRollupOptions, type RevenueRollupResult, type RevenueRollupRow, type SearchAcrossResourcesOptions, type SearchAcrossResourcesResult, type SearchAcrossResourcesRow, type ServedCreateGuidanceReport, type ServedCreateGuidanceRow, UI_LINK_ENTITIES, type UiLinkEntity, type UiLinkInput, type UiLinkResult, WORKFLOW_RESOURCES, aggregate, blindSurfaces, buildUiLink, createGuidance, dateBucketLabel, effectiveRequiredFields, expandResourceNames, fetchByIds, fetchMany, fieldCatalog, foldFlattenedOpts, invoke, invokeDelete, invokeRead, invokeWrite, isEnumerableResource, needsConfirmation, probeReachability, recovery, relationshipMap, resolveAny, resourceForEntityType, revenueRollup, searchAcrossResources, uiLink, unknownKeysRefusal, validateDispatchArgs, validateFetchManyItems, validateInvokeOptions, validateParamsBag };