n8n-nodes-autotask 2.26.2 → 2.26.3

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.
@@ -8,7 +8,7 @@ const debug_trace_1 = require("./debug-trace");
8
8
  const operation_metadata_1 = require("./operation-metadata");
9
9
  const typed_reference_1 = require("../helpers/typed-reference");
10
10
  const resource_language_1 = require("./resource-language");
11
- const operation_dispatch_1 = require("./operation-handlers/operation-dispatch");
11
+ const read_param_descriptions_1 = require("./read-param-descriptions");
12
12
  /** Picklist inlining threshold — at or below this count, inline all values; above, tell LLM to call listPicklistValues. */
13
13
  const INLINE_PICKLIST_THRESHOLD = 4;
14
14
  /** Anthropic API requires property keys to match this pattern. */
@@ -128,13 +128,8 @@ function getRuntimeSchemaBuilders(rz) {
128
128
  'in',
129
129
  'notIn',
130
130
  ]);
131
- const rFilterValueSchema = rz
132
- .string()
133
- .describe("Filter value as string. For reference/picklist fields, pass human-readable name (e.g. 'In Progress', 'Contoso', 'High') — auto-resolves to ID, or pass numeric ID directly. For in/notIn: comma-separate names or IDs (e.g. 'Neil,Andrew' or '123,456'). Each name resolved independently; names with multiple candidates return pendingConfirmations, already-resolved names shown in resolvedElements. Booleans: 'true'/'false'.");
134
- const rRecencySchema = rz
135
- .string()
136
- .nullish()
137
- .describe('Preset time window: last_15m, last_1h, last_2h, last_3h, last_4h, last_6h, last_8h, last_12h, last_24h, last_1d–last_7d, last_14d, last_30d, last_90d. Or last_Nd (N=1–365). Mutually exclusive with since/until.');
131
+ const rFilterValueSchema = rz.string().describe(read_param_descriptions_1.READ_PARAM_DESC.filter_value);
132
+ const rRecencySchema = rz.string().nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.recency);
138
133
  function buildUnifiedSchema(resource, operations, readFields, writeFields) {
139
134
  const operationMetadata = operations
140
135
  .map((operation) => (0, operation_metadata_1.getOperationMetadata)(operation))
@@ -231,7 +226,7 @@ function getRuntimeSchemaBuilders(rz) {
231
226
  .coerce.string()
232
227
  .nullish()
233
228
  .describe('Resource name, email, or numeric ID (auto-resolved). Required for getByResource and getByYear. ' +
234
- "For ticket.getByResource: searches primary (assignedResourceID) and/or secondary (TicketSecondaryResources) assignments based on mode.");
229
+ "For ticket.getByResource: searches primary (assignedResourceID) and/or secondary (TicketSecondaryResources) assignments per 'mode'.");
235
230
  }
236
231
  // ticket.getByResource — mode field + list-family params (operation metadata marks supportsFilters:false so inject manually)
237
232
  if (hasGetByResource && resource === 'ticket') {
@@ -249,7 +244,7 @@ function getRuntimeSchemaBuilders(rz) {
249
244
  .min(1)
250
245
  .max(500)
251
246
  .nullish()
252
- .describe('Max records per branch (1-500, default 10). Note: combined merged result may exceed limit when mode=both.');
247
+ .describe('Max records per branch (1-500, default 10). Combined merged result may exceed limit when mode=both.');
253
248
  }
254
249
  if (!shape.fields) {
255
250
  shape.fields = rz
@@ -260,16 +255,10 @@ function getRuntimeSchemaBuilders(rz) {
260
255
  if (!shape.recency)
261
256
  shape.recency = rRecencySchema;
262
257
  if (!shape.since) {
263
- shape.since = rz
264
- .string()
265
- .nullish()
266
- .describe('Range start (ISO-8601; e.g. 2026-01-01T09:00:00Z). Overrides recency.');
258
+ shape.since = rz.string().nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.since);
267
259
  }
268
260
  if (!shape.until) {
269
- shape.until = rz
270
- .string()
271
- .nullish()
272
- .describe('Range end (ISO-8601). Requires since or recency.');
261
+ shape.until = rz.string().nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.until);
273
262
  }
274
263
  if (!shape.excludeTerminalStatuses) {
275
264
  shape.excludeTerminalStatuses = rz
@@ -290,14 +279,14 @@ function getRuntimeSchemaBuilders(rz) {
290
279
  .number()
291
280
  .int()
292
281
  .nullish()
293
- .describe('Calendar year (e.g. 2024). Required for getByYear operation.');
282
+ .describe('Calendar year (e.g. 2024). Required for getByYear.');
294
283
  }
295
284
  // rejectReason — used only by reject
296
285
  if (hasReject) {
297
286
  shape.rejectReason = rz
298
287
  .string()
299
288
  .nullish()
300
- .describe('Reason for rejecting the time off request. Recommended for audit trail.');
289
+ .describe("Reason for rejecting the time off request. Required when rejectReasonPolicy='mandatory'.");
301
290
  shape.rejectReasonPolicy = rz
302
291
  .enum(['optional', 'mandatory'])
303
292
  .nullish()
@@ -306,9 +295,9 @@ function getRuntimeSchemaBuilders(rz) {
306
295
  // globalNotesSearch — virtual resource, custom fields only, skip all standard filter blocks
307
296
  if (resource === 'globalNotesSearch') {
308
297
  if (operations.includes('searchNotes')) {
309
- shape['keyword'] = rz.string().nullish().describe('Text to search across note titles and bodies (contains match). Applied to all 7 note entity types.');
310
- shape['since'] = rz.string().nullish().describe('ISO 8601 datetime — return only notes with createDateTime >= this value.');
311
- shape['until'] = rz.string().nullish().describe('ISO 8601 datetime — return only notes with createDateTime <= this value.');
298
+ shape['keyword'] = rz.string().nullish().describe('Text to search note titles and bodies (contains match) across all 7 note types. At least one of keyword, since, or until is required.');
299
+ shape['since'] = rz.string().nullish().describe('ISO-8601 datetime — notes with createDateTime >= this. At least one of keyword, since, or until is required.');
300
+ shape['until'] = rz.string().nullish().describe('ISO-8601 datetime — notes with createDateTime <= this. At least one of keyword, since, or until is required.');
312
301
  shape['limit'] = rz.number().int().min(1).max(25).nullish().describe('Max results per note entity type (default 10, max 25). Total records = 7 × limit at most.');
313
302
  }
314
303
  // Helper-op fields — describeFields/listPicklistValues/describeOperation are always
@@ -338,51 +327,29 @@ function getRuntimeSchemaBuilders(rz) {
338
327
  }
339
328
  // fields — column selection
340
329
  if (hasGetFamily || hasCreate) {
341
- shape.fields = rz
342
- .string()
343
- .nullish()
344
- .describe(`Sparse fieldset — comma-separated field names to return. Omit for all fields. The id field is always included automatically. ` +
345
- `Reduces payload size significantly for entities with many fields. ` +
346
- `With returnAll=true, specifying fields lifts the ${operation_dispatch_1.MAX_RESPONSE_RECORDS}-record payload cap — all matching records are returned. ` +
347
- `Real API field names only (call describeFields for the full list). Do not request *_label or *_name fields — those are auto-added by outputMode=idsAndLabels.`);
330
+ shape.fields = rz.string().nullish().describe((0, read_param_descriptions_1.fieldsDesc)());
348
331
  }
349
332
  // Filter fields for list operations
350
333
  const hasSearchByKeywordForListShared = operations.includes('searchByKeyword');
351
334
  if (hasListFamily || hasSearchByKeywordForListShared) {
352
335
  const fieldNames = readFields.filter((f) => !f.udf && isValidSchemaKey(f.id)).map((f) => f.id);
353
- const filterFieldDesc = "Field to filter on. Use operation 'describeFields' to see valid field names. For 'older than' / upper-bound date queries use filter_field with a date field + filter_op='lt'.";
336
+ const filterFieldPairClause = "Field to filter on. Provide filter_value with it (not needed when filter_op is 'exist'/'notExist'). For 'older than'/upper-bound date queries use a date field (createDate, lastActivityDate, dueDateTime) with filter_op='lt'.";
337
+ const filterFieldDesc = `${filterFieldPairClause} Use operation 'describeFields' to see valid field names.`;
354
338
  shape.filter_field =
355
339
  fieldNames.length > 0
356
340
  ? rz
357
341
  .enum(fieldNames)
358
342
  .nullish()
359
- .describe("Field to filter on. For 'older than' / upper-bound date queries, use a date field (createDate, lastActivityDate, dueDateTime) with filter_op='lt'.")
343
+ .describe(filterFieldPairClause)
360
344
  : rz.string().nullish().describe(filterFieldDesc);
361
- shape.filter_op = rFilterOpEnum.nullish().describe("Filter operator. Use 'notExist' for unassigned/empty/null fields (no filter_value needed). Use 'exist' for populated fields. Other operators: eq (equals), noteq (not equals), gt/gte/lt/lte (numeric/date comparisons), contains/beginsWith/endsWith (text), in/notIn (array of values).");
345
+ shape.filter_op = rFilterOpEnum.nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.filter_op);
362
346
  shape.filter_value = rFilterValueSchema.nullish();
363
- shape.filter_field_2 = rz
364
- .string()
365
- .nullish()
366
- .describe('Second filter field — same valid values as filter_field. Supports date fields with filter_op_2 for bounded date ranges.');
367
- shape.filter_op_2 = rFilterOpEnum.nullish().describe('Second filter operator');
368
- shape.filter_value_2 = rFilterValueSchema.nullish().describe('Second filter value');
369
- shape.filter_logic = rz
370
- .enum(['and', 'or'])
371
- .nullish()
372
- .describe("Combiner between the two filter pairs: 'and' (default) or 'or'.");
373
- shape.limit = rz
374
- .number()
375
- .int()
376
- .min(1)
377
- .max(500)
378
- .nullish()
379
- .describe('Max results (1-500, default 10)');
380
- shape.offset = rz
381
- .number()
382
- .int()
383
- .min(0)
384
- .nullish()
385
- .describe('Skip first N records (0–499). Response includes hasMore/nextOffset. Max 500 total — narrow filters for more.');
347
+ shape.filter_field_2 = rz.string().nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.filter_field_2);
348
+ shape.filter_op_2 = rFilterOpEnum.nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.filter_op_2);
349
+ shape.filter_value_2 = rFilterValueSchema.nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.filter_value_2);
350
+ shape.filter_logic = rz.enum(['and', 'or']).nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.filter_logic);
351
+ shape.limit = rz.number().int().min(1).max(500).nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.limit);
352
+ shape.offset = rz.number().int().min(0).nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.offset);
386
353
  shape.recency = rRecencySchema;
387
354
  const dateFields = readFields
388
355
  .filter((f) => !f.udf && isValidSchemaKey(f.id) && f.type.toLowerCase().includes('date'))
@@ -393,32 +360,14 @@ function getRuntimeSchemaBuilders(rz) {
393
360
  .nullish()
394
361
  .describe(`Date/time field for recency/since/until. Available: ${dateFields.join(', ')}. Default: first available.`);
395
362
  }
396
- shape.since = rz
397
- .string()
398
- .nullish()
399
- .describe('Range start (ISO-8601; e.g. 2026-01-01T09:00:00 or 2026-01-01T09:00:00Z). Overrides recency.');
400
- shape.until = rz
401
- .string()
402
- .nullish()
403
- .describe('Range end (ISO-8601). Requires since or recency.');
404
- shape.filtersJson = rz.string().nullish().describe(`Advanced filters as JSON array of Autotask IFilterCondition objects. Mutually exclusive with filter_field. No label resolution — use numeric IDs for all values including in/notIn (for name-based in/notIn use the filter_value param path instead). Dates UTC ISO-8601. ` +
405
- `Supports: eq/noteq/gt/gte/lt/lte/contains/beginsWith/endsWith/exist/notExist/in/notIn. ` +
406
- `in/notIn value must be a JSON array (max 500 values per Autotask API limit). ` +
407
- `Nested AND group: [{"op":"and","items":[<cond1>,<cond2>]}]. ` +
408
- `Nested OR group: [{"op":"or","items":[<cond1>,<cond2>]}]. ` +
409
- `Each condition shape: {"field":"<fieldName>","op":"<op>","value":<value>}. ` +
410
- `Call describeFields for valid field names on this resource, and listPicklistValues for valid picklist IDs.`);
411
- shape.returnAll = rz
412
- .coerce.boolean()
413
- .nullish()
414
- .describe(`Fetch ALL matching records via API cursor pagination. Default false = up to limit. ` +
415
- `Without fields: payload capped at ${operation_dispatch_1.MAX_RESPONSE_RECORDS} records. ` +
416
- `With fields param (sparse fieldset): cap lifted — all records returned. ` +
417
- `Pair returnAll=true with a narrow fields list for efficient bulk ID/lookup patterns.`);
363
+ shape.since = rz.string().nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.since);
364
+ shape.until = rz.string().nullish().describe(read_param_descriptions_1.READ_PARAM_DESC.until);
365
+ shape.filtersJson = rz.string().nullish().describe((0, read_param_descriptions_1.filtersJsonDesc)());
366
+ shape.returnAll = rz.coerce.boolean().nullish().describe((0, read_param_descriptions_1.returnAllDesc)());
418
367
  shape.outputMode = rz
419
368
  .enum(['idsAndLabels', 'rawIds'])
420
369
  .nullish()
421
- .describe("'idsAndLabels' (default): appends derived label fields to results (e.g. resourceID → resourceFullName + resourceEmail; picklist IDs → *_label). Do NOT include these in the fields param — they are auto-added. 'rawIds': numeric IDs only.");
370
+ .describe(read_param_descriptions_1.READ_PARAM_DESC.outputMode);
422
371
  // excludeTerminalStatuses — only for resources that have terminal status semantics
423
372
  if (resource_language_1.RESOURCES_WITH_TERMINAL_STATUS_EXCLUSION.has(resource) &&
424
373
  operations.includes('getMany') &&
@@ -434,15 +383,15 @@ function getRuntimeSchemaBuilders(rz) {
434
383
  shape.companyName = rz
435
384
  .string()
436
385
  .nullish()
437
- .describe('Optional company name for contains matching and ranking.');
386
+ .describe('Company name for contains matching and ranking.');
438
387
  shape.email = rz
439
388
  .string()
440
389
  .nullish()
441
- .describe('Optional email used to infer domain for matching.');
390
+ .describe('Email used to infer domain for matching.');
442
391
  shape.website = rz
443
392
  .string()
444
393
  .nullish()
445
- .describe('Optional website/domain used for primary domain matching.');
394
+ .describe('Website/domain used for primary domain matching.');
446
395
  shape.limit = rz
447
396
  .number()
448
397
  .int()
@@ -481,7 +430,7 @@ function getRuntimeSchemaBuilders(rz) {
481
430
  shape.ticketFields = rz
482
431
  .string()
483
432
  .nullish()
484
- .describe('Optional comma-separated ticket fields to return.');
433
+ .describe('Comma-separated ticket fields to return.');
485
434
  }
486
435
  // summary fields
487
436
  if (hasSummary) {
@@ -492,7 +441,7 @@ function getRuntimeSchemaBuilders(rz) {
492
441
  shape.summaryTextLimit = rz
493
442
  .number()
494
443
  .nullish()
495
- .describe('Maximum characters for description and resolution fields in the summary. Default 500. Pass 0 for no limit.');
444
+ .describe('Max characters for summary description/resolution fields (default 500; 0 = no limit).');
496
445
  shape.includeChildCounts = rz
497
446
  .coerce.boolean()
498
447
  .nullish()
@@ -540,19 +489,19 @@ function getRuntimeSchemaBuilders(rz) {
540
489
  .nullish()
541
490
  .describe(hasGetByCompanyAndStatus
542
491
  ? 'Company name or numeric companyID (auto-resolved). Required for getByCompanyAndStatus; optional for other ops.'
543
- : 'Company name or numeric companyID (auto-resolved). Optional — omit for all companies.');
492
+ : 'Company name or numeric companyID (auto-resolved). Omit for all companies.');
544
493
  }
545
494
  if (resource_language_1.RESOURCES_WITH_PRIORITY.has(resource) && !shape.priority) {
546
495
  shape.priority = rz
547
496
  .string()
548
497
  .nullish()
549
- .describe('Priority picklist label or ID (optional).');
498
+ .describe('Priority picklist label or ID.');
550
499
  }
551
500
  if (hasGetByCompanyAndStatus && !shape.status) {
552
501
  shape.status = rz
553
502
  .string()
554
503
  .nullish()
555
- .describe('Status picklist label or ID (optional). Omit for all statuses.');
504
+ .describe('Status picklist label or ID. Omit for all statuses.');
556
505
  }
557
506
  }
558
507
  // getBySLAStatus fields
@@ -574,7 +523,7 @@ function getRuntimeSchemaBuilders(rz) {
574
523
  shape.company = rz
575
524
  .string()
576
525
  .nullish()
577
- .describe('Company name or numeric companyID (auto-resolved). Optional.');
526
+ .describe('Company name or numeric companyID (auto-resolved).');
578
527
  }
579
528
  }
580
529
  // countByPeriod fields
@@ -590,19 +539,19 @@ function getRuntimeSchemaBuilders(rz) {
590
539
  shape.company = rz
591
540
  .string()
592
541
  .nullish()
593
- .describe('Company name or numeric companyID (auto-resolved). Optional.');
542
+ .describe('Company name or numeric companyID (auto-resolved).');
594
543
  }
595
544
  if (!shape.status) {
596
545
  shape.status = rz
597
546
  .string()
598
547
  .nullish()
599
- .describe('Status picklist label or ID (optional).');
548
+ .describe('Status picklist label or ID.');
600
549
  }
601
550
  if (resource_language_1.RESOURCES_WITH_PRIORITY.has(resource) && !shape.priority) {
602
551
  shape.priority = rz
603
552
  .string()
604
553
  .nullish()
605
- .describe('Priority picklist label or ID (optional).');
554
+ .describe('Priority picklist label or ID.');
606
555
  }
607
556
  }
608
557
  // getByAge fields
@@ -680,7 +629,7 @@ function getRuntimeSchemaBuilders(rz) {
680
629
  shape.userDefinedFields = rz
681
630
  .string()
682
631
  .nullish()
683
- .describe('JSON object of UDF field name → value pairs for user-defined fields. ' +
632
+ .describe('JSON object of UDF field name → value pairs. ' +
684
633
  'Keys must exactly match UDF field names as returned by describeFields (mode=write). ' +
685
634
  'Example: {"Customer Size": "Enterprise", "Region": "APAC"}. ' +
686
635
  'For picklist UDFs use the picklist value ID (label resolution not supported for UDFs).');
@@ -717,30 +666,30 @@ function getRuntimeSchemaBuilders(rz) {
717
666
  .int()
718
667
  .min(1)
719
668
  .nullish()
720
- .describe('Optional destination company location ID.');
669
+ .describe('Destination company location ID.');
721
670
  shape.destinationContactId = rz
722
671
  .number()
723
672
  .int()
724
673
  .min(1)
725
674
  .nullish()
726
- .describe('Optional destination contact ID.');
675
+ .describe('Destination contact ID.');
727
676
  shape.copyUdfs = rz
728
677
  .coerce.boolean()
729
678
  .nullish()
730
- .describe('Whether to copy user-defined fields (default true).');
679
+ .describe('Copy user-defined fields (default true).');
731
680
  shape.copyAttachments = rz
732
681
  .coerce.boolean()
733
682
  .nullish()
734
- .describe('Whether to copy CI attachments (default true).');
735
- shape.copyNotes = rz.coerce.boolean().nullish().describe('Whether to copy notes (default true).');
683
+ .describe('Copy CI attachments (default true).');
684
+ shape.copyNotes = rz.coerce.boolean().nullish().describe('Copy notes (default true).');
736
685
  shape.copyNoteAttachments = rz
737
686
  .coerce.boolean()
738
687
  .nullish()
739
- .describe('Whether to copy note attachments (default true).');
688
+ .describe('Copy note attachments (default true).');
740
689
  shape.deactivateSource = rz
741
690
  .coerce.boolean()
742
691
  .nullish()
743
- .describe('Whether to deactivate the source CI after safety checks (default true).');
692
+ .describe('Deactivate the source CI after safety checks (default true).');
744
693
  shape.idempotencyKey = rz.string().nullish().describe('Optional run key for traceability.');
745
694
  shape.includeMaskedUdfsPolicy = rz
746
695
  .enum(['omit', 'fail'])
@@ -771,7 +720,7 @@ function getRuntimeSchemaBuilders(rz) {
771
720
  shape.retryJitter = rz
772
721
  .coerce.boolean()
773
722
  .nullish()
774
- .describe('Whether to use jitter in retry backoff (default true).');
723
+ .describe('Use jitter in retry backoff (default true).');
775
724
  shape.throttleMaxBytesPer5Min = rz
776
725
  .number()
777
726
  .int()
@@ -816,31 +765,31 @@ function getRuntimeSchemaBuilders(rz) {
816
765
  .int()
817
766
  .min(1)
818
767
  .nullish()
819
- .describe('Optional destination company location ID.');
768
+ .describe('Destination company location ID.');
820
769
  shape.skipIfDuplicateEmailFound = rz
821
770
  .coerce.boolean()
822
771
  .nullish()
823
- .describe('Whether to skip move when duplicate email exists on destination (default true).');
772
+ .describe('Skip the move when a duplicate email exists on the destination (default true).');
824
773
  shape.copyContactGroups = rz
825
774
  .coerce.boolean()
826
775
  .nullish()
827
- .describe('Whether to copy contact group memberships (default true).');
776
+ .describe('Copy contact group memberships (default true).');
828
777
  shape.copyCompanyNotes = rz
829
778
  .coerce.boolean()
830
779
  .nullish()
831
- .describe('Whether to copy company notes linked to the contact (default true).');
780
+ .describe('Copy company notes linked to the contact (default true).');
832
781
  shape.copyNoteAttachments = rz
833
782
  .coerce.boolean()
834
783
  .nullish()
835
- .describe('Whether to copy attachments for copied notes (default true).');
784
+ .describe('Copy attachments for copied notes (default true).');
836
785
  shape.sourceAuditNote = rz
837
786
  .string()
838
787
  .nullish()
839
- .describe('Optional audit note written to the source company context.');
788
+ .describe('Audit note written to the source company context.');
840
789
  shape.destinationAuditNote = rz
841
790
  .string()
842
791
  .nullish()
843
- .describe('Optional audit note written to the destination company context.');
792
+ .describe('Audit note written to the destination company context.');
844
793
  if (!shape.impersonationResourceId) {
845
794
  shape.impersonationResourceId = rz
846
795
  .coerce.string()
@@ -871,31 +820,31 @@ function getRuntimeSchemaBuilders(rz) {
871
820
  shape.includeTickets = rz
872
821
  .coerce.boolean()
873
822
  .nullish()
874
- .describe('Whether to include tickets (default false).');
823
+ .describe('Include tickets (default false).');
875
824
  shape.includeProjects = rz
876
825
  .coerce.boolean()
877
826
  .nullish()
878
- .describe('Whether to include projects (default false).');
827
+ .describe('Include projects (default false).');
879
828
  shape.includeServiceCallAssignments = rz
880
829
  .coerce.boolean()
881
830
  .nullish()
882
- .describe('Whether to reassign service call task/ticket resources (default false).');
831
+ .describe('Reassign service call task/ticket resources (default false).');
883
832
  shape.includeAppointments = rz
884
833
  .coerce.boolean()
885
834
  .nullish()
886
- .describe('Whether to reassign appointments (default false).');
835
+ .describe('Reassign appointments (default false).');
887
836
  shape.includeCompanies = rz
888
837
  .coerce.boolean()
889
838
  .nullish()
890
- .describe('Whether to transfer companies owned by the source resource (default false).');
839
+ .describe('Transfer companies owned by the source resource (default false).');
891
840
  shape.companyIdAllowlist = rz
892
841
  .string()
893
842
  .nullish()
894
- .describe('Optional comma-separated company IDs to scope company transfer.');
843
+ .describe('Comma-separated company IDs to scope the transfer. Applies only when includeCompanies=true.');
895
844
  shape.includeOpportunities = rz
896
845
  .coerce.boolean()
897
846
  .nullish()
898
- .describe('Whether to transfer opportunities owned by the source resource (default false).');
847
+ .describe('Transfer opportunities owned by the source resource (default false).');
899
848
  shape.dueWindowPreset = rz
900
849
  .enum([
901
850
  'today',
@@ -910,7 +859,7 @@ function getRuntimeSchemaBuilders(rz) {
910
859
  'custom',
911
860
  ])
912
861
  .nullish()
913
- .describe("Optional due window preset. Use 'custom' with dueBeforeCustom.");
862
+ .describe("Due window preset. Use 'custom' with dueBeforeCustom.");
914
863
  shape.dueBeforeCustom = rz
915
864
  .string()
916
865
  .nullish()
@@ -922,7 +871,7 @@ function getRuntimeSchemaBuilders(rz) {
922
871
  shape.includeItemsWithNoDueDate = rz
923
872
  .coerce.boolean()
924
873
  .nullish()
925
- .describe('Whether items with no due date are included (default true, unless due window is set).');
874
+ .describe('Include items with no due date (default true, unless a due window is set).');
926
875
  shape.ticketAssignmentMode = rz
927
876
  .enum(['primaryOnly', 'primaryAndSecondary'])
928
877
  .nullish()
@@ -954,15 +903,15 @@ function getRuntimeSchemaBuilders(rz) {
954
903
  shape.statusAllowlistByLabel = rz
955
904
  .string()
956
905
  .nullish()
957
- .describe('Optional comma-separated status labels to include.');
906
+ .describe('Comma-separated status labels to allow. Ignored when statusAllowlistByValue is set. Supply only one of the two.');
958
907
  shape.statusAllowlistByValue = rz
959
908
  .string()
960
909
  .nullish()
961
- .describe('Optional comma-separated status integer values to include.');
910
+ .describe('Comma-separated status IDs to allow. Takes precedence — when set, statusAllowlistByLabel is ignored. Supply only one of the two.');
962
911
  shape.addAuditNotes = rz
963
912
  .coerce.boolean()
964
913
  .nullish()
965
- .describe('Whether to create per-entity audit notes (default false).');
914
+ .describe('Create per-entity audit notes (default false).');
966
915
  shape.auditNoteTemplate = rz
967
916
  .string()
968
917
  .nullish()
@@ -981,7 +930,7 @@ function getRuntimeSchemaBuilders(rz) {
981
930
  // getAvailableRoles fields
982
931
  if (operations.includes('getAvailableRoles')) {
983
932
  if (!shape.resourceID) {
984
- shape.resourceID = rz.coerce.string().nullish().describe('Required for getAvailableRoles. The resource (technician) ID or name to find available roles for.');
933
+ shape.resourceID = rz.coerce.string().nullish().describe('Resource (technician) ID or name to find available roles for. Required for getAvailableRoles.');
985
934
  }
986
935
  if (!shape.ticketID) {
987
936
  shape.ticketID = rz.coerce.string().nullish().describe('Ticket ID. If provided, derives queueID and contractID from the ticket automatically.');
@@ -1022,7 +971,7 @@ function getRuntimeSchemaBuilders(rz) {
1022
971
  shape.userDefinedFields = rz
1023
972
  .string()
1024
973
  .nullish()
1025
- .describe('JSON object of UDF field name → value pairs for user-defined fields. ' +
974
+ .describe('JSON object of UDF field name → value pairs. ' +
1026
975
  'Keys must exactly match UDF field names as returned by describeFields (mode=write). ' +
1027
976
  'Example: {"Customer Size": "Enterprise", "Region": "APAC"}. ' +
1028
977
  'For picklist UDFs use the picklist value ID (label resolution not supported for UDFs).');