node-autotask 0.43.0 → 0.45.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 (57) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/MCP_TOOL_CATALOG.json +156 -1253
  3. package/MCP_TOOL_MANIFEST.md +154 -220
  4. package/MCP_TOOL_OVERRIDES.json +8 -62
  5. package/N8N_MCP_MANIFEST.json +128 -705
  6. package/N8N_MCP_MANIFEST.md +43 -63
  7. package/README.md +10 -28
  8. package/capabilities.json +15315 -22219
  9. package/dist/{base-CVx2VMSj.d.cts → base-BVoYDlVA.d.cts} +2 -1
  10. package/dist/{base-CVx2VMSj.d.ts → base-BVoYDlVA.d.ts} +2 -1
  11. package/dist/capabilities.cjs +2 -2
  12. package/dist/capabilities.d.cts +2 -1
  13. package/dist/capabilities.d.ts +2 -1
  14. package/dist/capabilities.js +1 -1
  15. package/dist/{chunk-5VHSLJMR.js → chunk-A6LHCJQP.js} +30 -9
  16. package/dist/{chunk-JY2BWYXY.js → chunk-ASMCTZO2.js} +15314 -22218
  17. package/dist/{chunk-TH7B5H4P.cjs → chunk-DC3PY4EF.cjs} +1839 -1407
  18. package/dist/{chunk-4EFXIE53.js → chunk-DXKXQHCX.js} +5 -5
  19. package/dist/{chunk-SK3GYRNA.cjs → chunk-JO6WI763.cjs} +143 -143
  20. package/dist/{chunk-Q23JULNN.js → chunk-NSW7JPVS.js} +11529 -13319
  21. package/dist/{chunk-KTEDPS4X.js → chunk-O4PIPUS4.js} +1583 -1151
  22. package/dist/{chunk-MJTKK3QG.cjs → chunk-SN4BMQ2N.cjs} +31 -10
  23. package/dist/{chunk-5BDUMDAQ.cjs → chunk-VXVYFJH3.cjs} +15314 -22218
  24. package/dist/{chunk-VFLAMMIJ.cjs → chunk-YMBVKVK4.cjs} +10604 -12394
  25. package/dist/{index-C7rMJ4IV.d.ts → index-C5g1H_hF.d.ts} +1080 -1288
  26. package/dist/{index-Cm_Xpt7X.d.cts → index-Db0SNnQn.d.cts} +1080 -1288
  27. package/dist/{index-C3KFMnRT.d.cts → index-c549LvOb.d.cts} +332 -331
  28. package/dist/{index-C3KFMnRT.d.ts → index-c549LvOb.d.ts} +332 -331
  29. package/dist/index.cjs +23 -23
  30. package/dist/index.d.cts +15 -41
  31. package/dist/index.d.ts +15 -41
  32. package/dist/index.js +8 -8
  33. package/dist/operations/index.cjs +5 -2234
  34. package/dist/operations/index.d.cts +51 -323
  35. package/dist/operations/index.d.ts +51 -323
  36. package/dist/operations/index.js +30 -2259
  37. package/dist/pool.cjs +9 -9
  38. package/dist/pool.d.cts +4 -3
  39. package/dist/pool.d.ts +4 -3
  40. package/dist/pool.js +5 -5
  41. package/dist/resources/index.cjs +5 -5
  42. package/dist/resources/index.d.cts +2 -2
  43. package/dist/resources/index.d.ts +2 -2
  44. package/dist/resources/index.js +8 -8
  45. package/dist/types/index.d.cts +1 -1
  46. package/dist/types/index.d.ts +1 -1
  47. package/dist/untrusted.cjs +2 -2
  48. package/dist/untrusted.d.cts +14 -5
  49. package/dist/untrusted.d.ts +14 -5
  50. package/dist/untrusted.js +1 -1
  51. package/docs/API.md +321 -334
  52. package/docs/LIVE-TESTING.md +4 -6
  53. package/docs/N8N-ADAPTER.md +26 -26
  54. package/examples/mcp/schemas.ts +2 -0
  55. package/examples/mcp/tools-read.ts +3 -2
  56. package/n8n-mcp.curation.json +3 -3
  57. package/package.json +10 -9
@@ -1,4 +1,4 @@
1
- import { q as AuditEvent, e$ as ResolutionCaps, Q as QueryParams, cX as EmptyReasonInfo, e_ as Resolution, I as Identifier, e4 as Page, cZ as EntityInformationModel, dc as FieldInformationModel, da as Field, a as FilterCondition, O as OperationResult, cW as DryRunResult, m as Appointment, n as AppointmentCreate, p as AppointmentUpdate, o as AppointmentSummary, r as AuthTokenResultModel, B as BillingCode, t as BillingCodeCreate, v as BillingCodeUpdate, u as BillingCodeSummary, w as BillingItemApprovalLevel, x as BillingItemApprovalLevelCreate, z as BillingItemApprovalLevelUpdate, D as BillingItems, G as BillingItemsCreate, K as BillingItemsUpdate, J as BillingItemsSummary, C as ChangeRequestLink, L as ChangeRequestLinkCreate, N as ChangeRequestLinkUpdate, M as ChangeRequestLinkSummary, R as ChecklistLibrary, X as ChecklistLibraryCreate, Z as ChecklistLibraryUpdate, Y as ChecklistLibrarySummary, S as ChecklistLibraryChecklistItem, U as ChecklistLibraryChecklistItemCreate, W as ChecklistLibraryChecklistItemUpdate, V as ChecklistLibraryChecklistItemSummary, _ as ClassificationIcon, $ as ClassificationIconCreate, a1 as ClassificationIconUpdate, a0 as ClassificationIconSummary, a2 as Company, e0 as OrganizationalLevelAssociation, dY as OrganizationalLevel2, dU as OrganizationalLevel1, a9 as CompanyLocation, b3 as Contact, ad as CompanyNote, gJ as Ticket, ei as Project, hW as CompositeNamesSection, l as TimeEntry, a8 as CompanyCreate, am as CompanyUpdate, al as CompanySummary, a7 as CompanyContext, a3 as CompanyAlert, a4 as CompanyAlertCreate, a6 as CompanyAlertUpdate, a5 as CompanyAlertSummary, aa as CompanyLocationCreate, ac as CompanyLocationUpdate, ab as CompanyLocationSummary, ae as CompanyNoteCreate, ag as CompanyNoteUpdate, af as CompanyNoteSummary, ah as CompanySiteConfigurations, ai as CompanySiteConfigurationsCreate, ak as CompanySiteConfigurationsUpdate, aj as CompanySiteConfigurationsSummary, an as CompanyWebhook, ao as CompanyWebhookCreate, aq as CompanyWebhookUpdate, ap as CompanyWebhookSummary, ar as ConfigurationItemBillingProductAssociations, as as ConfigurationItemBillingProductAssociationsCreate, au as ConfigurationItemBillingProductAssociationsUpdate, at as ConfigurationItemBillingProductAssociationsSummary, av as ConfigurationItemCategory, aw as ConfigurationItemCategoryCreate, aC as ConfigurationItemCategoryUpdate, ax as ConfigurationItemCategorySummary, ay as ConfigurationItemCategoryUdfAssociation, az as ConfigurationItemCategoryUdfAssociationCreate, aB as ConfigurationItemCategoryUdfAssociationUpdate, aA as ConfigurationItemCategoryUdfAssociationSummary, aF as ConfigurationItemDnsRecord, aG as ConfigurationItemDnsRecordCreate, aI as ConfigurationItemDnsRecordUpdate, aH as ConfigurationItemDnsRecordSummary, aJ as ConfigurationItemNote, aK as ConfigurationItemNoteCreate, aM as ConfigurationItemNoteUpdate, aL as ConfigurationItemNoteSummary, aN as ConfigurationItemRelatedItem, aO as ConfigurationItemRelatedItemCreate, aQ as ConfigurationItemRelatedItemUpdate, aP as ConfigurationItemRelatedItemSummary, c as ConfigurationItem, aW as ConfigurationItemType, aE as ConfigurationItemCreate, a_ as ConfigurationItemUpdate, aV as ConfigurationItemSummary, aD as ConfigurationItemContext, aR as ConfigurationItemSslSubjectAlternativeName, aS as ConfigurationItemSslSubjectAlternativeNameCreate, aU as ConfigurationItemSslSubjectAlternativeNameUpdate, aT as ConfigurationItemSslSubjectAlternativeNameSummary, aX as ConfigurationItemTypeCreate, aZ as ConfigurationItemTypeUpdate, aY as ConfigurationItemTypeSummary, a$ as ConfigurationItemWebhook, b0 as ConfigurationItemWebhookCreate, b2 as ConfigurationItemWebhookUpdate, b1 as ConfigurationItemWebhookSummary, b6 as ContactGroupContacts, b7 as ContactGroupContactsCreate, b9 as ContactGroupContactsUpdate, b8 as ContactGroupContactsSummary, ba as ContactGroups, bb as ContactGroupsCreate, bd as ContactGroupsUpdate, bc as ContactGroupsSummary, be as ContactSummary, b5 as ContactCreate, bf as ContactUpdate, b4 as ContactContext, bg as ContactWebhook, bh as ContactWebhookCreate, bj as ContactWebhookUpdate, bi as ContactWebhookSummary, bk as ContractBillingRule, bl as ContractBillingRuleCreate, bn as ContractBillingRuleUpdate, bm as ContractBillingRuleSummary, bq as ContractBlockHourFactor, br as ContractBlockHourFactorCreate, bt as ContractBlockHourFactorUpdate, bs as ContractBlockHourFactorSummary, bo as ContractBlock, bp as ContractBlockCreate, bv as ContractBlockUpdate, bu as ContractBlockSummary, d as ContractCharge, bw as ContractChargeCreate, by as ContractChargeUpdate, bx as ContractChargeSummary, bA as ContractExclusionBillingCode, bB as ContractExclusionBillingCodeCreate, bD as ContractExclusionBillingCodeUpdate, bC as ContractExclusionBillingCodeSummary, bE as ContractExclusionRoles, bF as ContractExclusionRolesCreate, bH as ContractExclusionRolesUpdate, bG as ContractExclusionRolesSummary, bI as ContractExclusionSetExcludedRoles, bJ as ContractExclusionSetExcludedRolesCreate, bL as ContractExclusionSetExcludedRolesUpdate, bK as ContractExclusionSetExcludedRolesSummary, bM as ContractExclusionSetExcludedWorkTypes, bN as ContractExclusionSetExcludedWorkTypesCreate, bP as ContractExclusionSetExcludedWorkTypesUpdate, bO as ContractExclusionSetExcludedWorkTypesSummary, bQ as ContractExclusionSets, bR as ContractExclusionSetsCreate, bT as ContractExclusionSetsUpdate, bS as ContractExclusionSetsSummary, bU as ContractMilestone, bV as ContractMilestoneCreate, bX as ContractMilestoneUpdate, bW as ContractMilestoneSummary, bY as ContractNote, bZ as ContractNoteCreate, b$ as ContractNoteUpdate, b_ as ContractNoteSummary, c0 as ContractRate, c1 as ContractRateCreate, c3 as ContractRateUpdate, c2 as ContractRateSummary, c4 as ContractRetainers, c5 as ContractRetainersCreate, c7 as ContractRetainersUpdate, c6 as ContractRetainersSummary, c8 as ContractRoleCosts, c9 as ContractRoleCostsCreate, cb as ContractRoleCostsUpdate, ca as ContractRoleCostsSummary, cc as ContractServiceAdjustment, cd as ContractServiceAdjustmentCreate, cf as ContractServiceAdjustmentUpdate, ce as ContractServiceAdjustmentSummary, ch as ContractServiceBundleAdjustment, ci as ContractServiceBundleAdjustmentCreate, ck as ContractServiceBundleAdjustmentUpdate, cj as ContractServiceBundleAdjustmentSummary, cg as ContractServiceBundle, cl as ContractServiceBundleCreate, cr as ContractServiceBundleUpdate, cm as ContractServiceBundleSummary, cn as ContractServiceBundleUnit, co as ContractServiceBundleUnitCreate, cq as ContractServiceBundleUnitUpdate, cp as ContractServiceBundleUnitSummary, f as ContractService, cs as ContractServiceCreate, cy as ContractServiceUpdate, ct as ContractServiceSummary, cu as ContractServiceUnit, cv as ContractServiceUnitCreate, cx as ContractServiceUnitUpdate, cw as ContractServiceUnitSummary, e as Contract, dt as Invoice, f0 as Resource, E as ExpenseItem, g4 as Subscription, bz as ContractCreate, cE as ContractUpdate, cz as ContractSummary, cA as ContractTicketPurchases, cB as ContractTicketPurchasesCreate, cD as ContractTicketPurchasesUpdate, cC as ContractTicketPurchasesSummary, cF as Country, cG as CountryCreate, cI as CountryUpdate, cH as CountrySummary, cJ as Currency, cK as CurrencyCreate, cM as CurrencyUpdate, cL as CurrencySummary, cN as Department, cO as DepartmentCreate, cQ as DepartmentUpdate, cP as DepartmentSummary, cS as DomainRegistrar, cT as DomainRegistrarCreate, cV as DomainRegistrarUpdate, cU as DomainRegistrarSummary, de as GlobalEntityInformationResultModel, c$ as ExpenseItemAttachment, d0 as ExpenseItemAttachmentCreate, d2 as ExpenseItemAttachmentUpdate, d1 as ExpenseItemAttachmentSummary, d3 as ExpenseItemCreate, d5 as ExpenseItemUpdate, d4 as ExpenseItemSummary, d6 as ExpenseReport, d7 as ExpenseReportCreate, d9 as ExpenseReportUpdate, d8 as ExpenseReportSummary, g as HolidaySet, dg as HolidaySetCreate, di as HolidaySetUpdate, dh as HolidaySetSummary, H as Holiday, df as HolidayCreate, dk as HolidayUpdate, dj as HolidaySummary, dl as InventoryProduct, dm as InventoryProductCreate, dp as InventoryProductUpdate, dn as InventoryProductSummary, dq as InventoryStockedItemAdd, dr as InventoryStockedItemRemove, ds as InventoryStockedItemTransfer, du as InvoiceCreate, dA as InvoiceUpdate, dv as InvoiceSummary, dw as InvoiceTemplate, dx as InvoiceTemplateCreate, dz as InvoiceTemplateUpdate, dC as ModuleAccessResultModel, dD as NotificationHistory, dE as NotificationHistoryCreate, dG as NotificationHistoryUpdate, dF as NotificationHistorySummary, h as Opportunity, dR as OpportunityCreate, dT as OpportunityUpdate, dS as OpportunitySummary, dJ as OpportunityAttachment, dK as OpportunityAttachmentCreate, dM as OpportunityAttachmentUpdate, dL as OpportunityAttachmentSummary, dN as OpportunityCategory, dO as OpportunityCategoryCreate, dQ as OpportunityCategoryUpdate, dP as OpportunityCategorySummary, dV as OrganizationalLevel1Create, dX as OrganizationalLevel1Update, dZ as OrganizationalLevel2Create, d$ as OrganizationalLevel2Update, e1 as OrganizationalLevelAssociationCreate, e3 as OrganizationalLevelAssociationUpdate, e5 as Phase, e6 as PhaseCreate, e8 as PhaseUpdate, e7 as PhaseSummary, ea as Product, eb as ProductCreate, ed as ProductUpdate, ec as ProductSummary, ee as ProductVendors, ef as ProductVendorsCreate, eh as ProductVendorsUpdate, eg as ProductVendorsSummary, i as ProjectCharge, ej as ProjectChargeCreate, el as ProjectChargeUpdate, ek as ProjectChargeSummary, eo as ProjectNote, ep as ProjectNoteCreate, er as ProjectNoteUpdate, eq as ProjectNoteSummary, en as ProjectCreate, et as ProjectUpdate, es as ProjectSummary, hX as CompositeContextOptions, em as ProjectContext, eu as PurchaseApprovals, ev as PurchaseApprovalsCreate, ex as PurchaseApprovalsUpdate, ew as PurchaseApprovalsSummary, ey as PurchaseOrderItemReceiving, ez as PurchaseOrderItemReceivingCreate, eB as PurchaseOrderItemReceivingUpdate, eA as PurchaseOrderItemReceivingSummary, eC as PurchaseOrderItems, eD as PurchaseOrderItemsCreate, eF as PurchaseOrderItemsUpdate, eE as PurchaseOrderItemsSummary, eG as PurchaseOrders, eH as PurchaseOrdersCreate, eJ as PurchaseOrdersUpdate, eI as PurchaseOrdersSummary, eM as QuoteItem, eN as QuoteItemCreate, eP as QuoteItemUpdate, eO as QuoteItemSummary, eQ as QuoteLocation, eR as QuoteLocationCreate, eT as QuoteLocationUpdate, eS as QuoteLocationSummary, eK as Quote, eL as QuoteCreate, eZ as QuoteUpdate, eU as QuoteSummary, eV as QuoteTemplate, eW as QuoteTemplateCreate, eY as QuoteTemplateUpdate, eX as QuoteTemplateSummary, f4 as ResourceRoleQueue, f5 as ResourceRoleQueueCreate, f7 as ResourceRoleQueueUpdate, f6 as ResourceRoleQueueSummary, f2 as ResourceRole, f3 as ResourceRoleCreate, f9 as ResourceRoleUpdate, f8 as ResourceRoleSummary, fa as ResourceSkill, fb as ResourceSkillCreate, fd as ResourceSkillUpdate, fc as ResourceSkillSummary, f1 as ResourceCreate, fr as ResourceUpdate, fe as ResourceSummary, ff as ResourceTimeOffAdditional, fg as ResourceTimeOffAdditionalCreate, fi as ResourceTimeOffAdditionalUpdate, fh as ResourceTimeOffAdditionalSummary, fj as ResourceTimeOffApprover, fk as ResourceTimeOffApproverCreate, fm as ResourceTimeOffApproverUpdate, fl as ResourceTimeOffApproverSummary, fn as ResourceTimeOffBalance, fo as ResourceTimeOffBalanceCreate, fq as ResourceTimeOffBalanceUpdate, fp as ResourceTimeOffBalanceSummary, fs as Role, ft as RoleCreate, fv as RoleUpdate, fu as RoleSummary, fw as SalesOrder, fx as SalesOrderCreate, fz as SalesOrderUpdate, fB as ServiceCall, fC as ServiceCallCreate, fU as ServiceCallUpdate, fD as ServiceCallSummary, fG as ServiceCallTaskResource, fH as ServiceCallTaskResourceCreate, fJ as ServiceCallTaskResourceUpdate, fI as ServiceCallTaskResourceSummary, fE as ServiceCallTask, fF as ServiceCallTaskCreate, fL as ServiceCallTaskUpdate, fK as ServiceCallTaskSummary, fO as ServiceCallTicketResource, fP as ServiceCallTicketResourceCreate, fR as ServiceCallTicketResourceUpdate, fQ as ServiceCallTicketResourceSummary, fM as ServiceCallTicket, fN as ServiceCallTicketCreate, fT as ServiceCallTicketUpdate, fS as ServiceCallTicketSummary, fW as ServiceLevelAgreementResults, fX as ServiceLevelAgreementResultsCreate, fZ as ServiceLevelAgreementResultsUpdate, fY as ServiceLevelAgreementResultsSummary, fA as Service, fV as ServiceCreate, f$ as ServiceUpdate, f_ as ServiceSummary, g0 as Skill, g1 as SkillCreate, g3 as SkillUpdate, g2 as SkillSummary, g6 as SubscriptionPeriod, g7 as SubscriptionPeriodCreate, g9 as SubscriptionPeriodUpdate, g8 as SubscriptionPeriodSummary, g5 as SubscriptionCreate, gb as SubscriptionUpdate, ga as SubscriptionSummary, ge as SurveyResults, gf as SurveyResultsCreate, gh as SurveyResultsUpdate, gg as SurveyResultsSummary, gc as Survey, gd as SurveyCreate, gj as SurveyUpdate, gi as SurveySummary, gl as TagAlias, gm as TagAliasCreate, go as TagAliasUpdate, gn as TagAliasSummary, gq as TagGroup, gr as TagGroupCreate, gt as TagGroupUpdate, gs as TagGroupSummary, gk as Tag, gp as TagCreate, gv as TagUpdate, gu as TagSummary, gy as TaskSecondaryResource, gz as TaskSecondaryResourceCreate, gB as TaskSecondaryResourceUpdate, gA as TaskSecondaryResourceSummary, gw as Task, gx as TaskCreate, gD as TaskUpdate, gC as TaskSummary, gE as TaxRegion, gF as TaxRegionCreate, gH as TaxRegionUpdate, gI as ThresholdStatusResultModel, T as TicketAdditionalConfigurationItem, gK as TicketAdditionalConfigurationItemCreate, gM as TicketAdditionalConfigurationItemUpdate, gL as TicketAdditionalConfigurationItemSummary, j as TicketAdditionalContact, gN as TicketAdditionalContactCreate, gP as TicketAdditionalContactUpdate, gO as TicketAdditionalContactSummary, gQ as TicketAttachment, gR as TicketAttachmentCreate, gT as TicketAttachmentUpdate, gS as TicketAttachmentSummary, gU as TicketCategory, gV as TicketCategoryCreate, g$ as TicketCategoryUpdate, g_ as TicketCategorySummary, gW as TicketCategoryFieldDefault, gX as TicketCategoryFieldDefaultCreate, gZ as TicketCategoryFieldDefaultUpdate, gY as TicketCategoryFieldDefaultSummary, h0 as TicketChangeRequestApproval, h1 as TicketChangeRequestApprovalCreate, h3 as TicketChangeRequestApprovalUpdate, h2 as TicketChangeRequestApprovalSummary, k as TicketCharge, h4 as TicketChargeCreate, h6 as TicketChargeUpdate, h5 as TicketChargeSummary, h7 as TicketChecklistItem, h8 as TicketChecklistItemCreate, ha as TicketChecklistItemUpdate, h9 as TicketChecklistItemSummary, hb as TicketChecklistLibrary, hc as TicketChecklistLibraryCreate, he as TicketChecklistLibraryUpdate, hd as TicketChecklistLibrarySummary, hh as TicketHistory, hi as TicketHistoryCreate, hk as TicketHistoryUpdate, hj as TicketHistorySummary, hm as TicketNoteAttachment, hn as TicketNoteAttachmentCreate, hp as TicketNoteAttachmentUpdate, ho as TicketNoteAttachmentSummary, hl as TicketNote, hq as TicketNoteCreate, hs as TicketNoteUpdate, hr as TicketNoteSummary, ht as TicketNoteWebhook, hu as TicketNoteWebhookCreate, hw as TicketNoteWebhookUpdate, hv as TicketNoteWebhookSummary, hx as TicketSecondaryResource, hy as TicketSecondaryResourceCreate, hA as TicketSecondaryResourceUpdate, hz as TicketSecondaryResourceSummary, hg as TicketCreate, hC as TicketUpdate, hB as TicketSummary, hf as TicketContext, hD as TicketWebhook, hE as TicketWebhookCreate, hG as TicketWebhookUpdate, hF as TicketWebhookSummary, hL as TimeEntryCreate, hN as TimeEntryUpdate, hM as TimeEntrySummary, hH as TimeEntryAttachment, hI as TimeEntryAttachmentCreate, hK as TimeEntryAttachmentUpdate, hJ as TimeEntryAttachmentSummary, hO as TimeOffRequest, hP as TimeOffRequestCreate, hS as TimeOffRequestUpdate, hR as TimeOffRequestSummary, A as ApiVersionResultModel, s as AutotaskVersionResultModel, hU as ZoneInformationResultModel } from './index-C3KFMnRT.cjs';
1
+ import { i as AuditEvent, eY as ResolutionCaps, I as Identifier, dZ as OrganizationalLevelAssociation, dV as OrganizationalLevel2, dR as OrganizationalLevel1, E as EmptyReasonInfo, Q as QueryParams, eX as Resolution, e1 as Page, cS as EntityInformationModel, d6 as FieldInformationModel, d4 as Field, c as FilterCondition, O as OperationResult, cQ as DryRunResult, e as Appointment, f as AppointmentCreate, h as AppointmentUpdate, g as AppointmentSummary, j as AuthTokenResultModel, B as BillingCode, l as BillingCodeCreate, n as BillingCodeUpdate, m as BillingCodeSummary, o as BillingItemApprovalLevel, p as BillingItemApprovalLevelCreate, r as BillingItemApprovalLevelUpdate, s as BillingItems, t as BillingItemsCreate, v as BillingItemsUpdate, u as BillingItemsSummary, C as ChangeRequestLink, w as ChangeRequestLinkCreate, y as ChangeRequestLinkUpdate, x as ChangeRequestLinkSummary, z as ChecklistLibrary, K as ChecklistLibraryCreate, M as ChecklistLibraryUpdate, L as ChecklistLibrarySummary, D as ChecklistLibraryChecklistItem, G as ChecklistLibraryChecklistItemCreate, J as ChecklistLibraryChecklistItemUpdate, H as ChecklistLibraryChecklistItemSummary, N as ClassificationIcon, R as ClassificationIconCreate, T as ClassificationIconUpdate, S as ClassificationIconSummary, U as Company, $ as CompanyLocation, aW as Contact, a3 as CompanyNote, gG as Ticket, ee as Project, hW as CompositeNamesSection, hH as TimeEntry, _ as CompanyCreate, ac as CompanyUpdate, ab as CompanySummary, Z as CompanyContext, V as CompanyAlert, W as CompanyAlertCreate, Y as CompanyAlertUpdate, X as CompanyAlertSummary, a0 as CompanyLocationCreate, a2 as CompanyLocationUpdate, a1 as CompanyLocationSummary, a4 as CompanyNoteCreate, a6 as CompanyNoteUpdate, a5 as CompanyNoteSummary, a7 as CompanySiteConfigurations, a8 as CompanySiteConfigurationsCreate, aa as CompanySiteConfigurationsUpdate, a9 as CompanySiteConfigurationsSummary, ad as CompanyWebhook, ae as CompanyWebhookCreate, ag as CompanyWebhookUpdate, af as CompanyWebhookSummary, ai as ConfigurationItemBillingProductAssociations, aj as ConfigurationItemBillingProductAssociationsCreate, al as ConfigurationItemBillingProductAssociationsUpdate, ak as ConfigurationItemBillingProductAssociationsSummary, am as ConfigurationItemCategory, an as ConfigurationItemCategoryCreate, at as ConfigurationItemCategoryUpdate, ao as ConfigurationItemCategorySummary, ap as ConfigurationItemCategoryUdfAssociation, aq as ConfigurationItemCategoryUdfAssociationCreate, as as ConfigurationItemCategoryUdfAssociationUpdate, ar as ConfigurationItemCategoryUdfAssociationSummary, aw as ConfigurationItemDnsRecord, ax as ConfigurationItemDnsRecordCreate, az as ConfigurationItemDnsRecordUpdate, ay as ConfigurationItemDnsRecordSummary, aA as ConfigurationItemNote, aB as ConfigurationItemNoteCreate, aD as ConfigurationItemNoteUpdate, aC as ConfigurationItemNoteSummary, aE as ConfigurationItemRelatedItem, aF as ConfigurationItemRelatedItemCreate, aH as ConfigurationItemRelatedItemUpdate, aG as ConfigurationItemRelatedItemSummary, ah as ConfigurationItem, aN as ConfigurationItemType, av as ConfigurationItemCreate, aR as ConfigurationItemUpdate, aM as ConfigurationItemSummary, au as ConfigurationItemContext, aI as ConfigurationItemSslSubjectAlternativeName, aJ as ConfigurationItemSslSubjectAlternativeNameCreate, aL as ConfigurationItemSslSubjectAlternativeNameUpdate, aK as ConfigurationItemSslSubjectAlternativeNameSummary, aO as ConfigurationItemTypeCreate, aQ as ConfigurationItemTypeUpdate, aP as ConfigurationItemTypeSummary, aS as ConfigurationItemWebhook, aT as ConfigurationItemWebhookCreate, aV as ConfigurationItemWebhookUpdate, aU as ConfigurationItemWebhookSummary, aZ as ContactGroupContacts, a_ as ContactGroupContactsCreate, b0 as ContactGroupContactsUpdate, a$ as ContactGroupContactsSummary, b1 as ContactGroups, b2 as ContactGroupsCreate, b4 as ContactGroupsUpdate, b3 as ContactGroupsSummary, aY as ContactCreate, b6 as ContactUpdate, b5 as ContactSummary, aX as ContactContext, b7 as ContactWebhook, b8 as ContactWebhookCreate, ba as ContactWebhookUpdate, b9 as ContactWebhookSummary, bc as ContractBillingRule, bd as ContractBillingRuleCreate, bf as ContractBillingRuleUpdate, be as ContractBillingRuleSummary, bi as ContractBlockHourFactor, bj as ContractBlockHourFactorCreate, bl as ContractBlockHourFactorUpdate, bk as ContractBlockHourFactorSummary, bg as ContractBlock, bh as ContractBlockCreate, bn as ContractBlockUpdate, bm as ContractBlockSummary, bo as ContractCharge, bp as ContractChargeCreate, br as ContractChargeUpdate, bq as ContractChargeSummary, bt as ContractExclusionBillingCode, bu as ContractExclusionBillingCodeCreate, bw as ContractExclusionBillingCodeUpdate, bv as ContractExclusionBillingCodeSummary, bx as ContractExclusionRoles, by as ContractExclusionRolesCreate, bA as ContractExclusionRolesUpdate, bz as ContractExclusionRolesSummary, bB as ContractExclusionSetExcludedRoles, bC as ContractExclusionSetExcludedRolesCreate, bE as ContractExclusionSetExcludedRolesUpdate, bD as ContractExclusionSetExcludedRolesSummary, bF as ContractExclusionSetExcludedWorkTypes, bG as ContractExclusionSetExcludedWorkTypesCreate, bI as ContractExclusionSetExcludedWorkTypesUpdate, bH as ContractExclusionSetExcludedWorkTypesSummary, bJ as ContractExclusionSets, bK as ContractExclusionSetsCreate, bM as ContractExclusionSetsUpdate, bL as ContractExclusionSetsSummary, bN as ContractMilestone, bO as ContractMilestoneCreate, bQ as ContractMilestoneUpdate, bP as ContractMilestoneSummary, bR as ContractNote, bS as ContractNoteCreate, bU as ContractNoteUpdate, bT as ContractNoteSummary, bV as ContractRate, bW as ContractRateCreate, bY as ContractRateUpdate, bX as ContractRateSummary, bZ as ContractRetainers, b_ as ContractRetainersCreate, c0 as ContractRetainersUpdate, b$ as ContractRetainersSummary, c1 as ContractRoleCosts, c2 as ContractRoleCostsCreate, c4 as ContractRoleCostsUpdate, c3 as ContractRoleCostsSummary, c6 as ContractServiceAdjustment, c7 as ContractServiceAdjustmentCreate, c9 as ContractServiceAdjustmentUpdate, c8 as ContractServiceAdjustmentSummary, cb as ContractServiceBundleAdjustment, cc as ContractServiceBundleAdjustmentCreate, ce as ContractServiceBundleAdjustmentUpdate, cd as ContractServiceBundleAdjustmentSummary, ca as ContractServiceBundle, cf as ContractServiceBundleCreate, cl as ContractServiceBundleUpdate, cg as ContractServiceBundleSummary, ch as ContractServiceBundleUnit, ci as ContractServiceBundleUnitCreate, ck as ContractServiceBundleUnitUpdate, cj as ContractServiceBundleUnitSummary, c5 as ContractService, cm as ContractServiceCreate, cs as ContractServiceUpdate, cn as ContractServiceSummary, co as ContractServiceUnit, cp as ContractServiceUnitCreate, cr as ContractServiceUnitUpdate, cq as ContractServiceUnitSummary, bb as Contract, dp as Invoice, eZ as Resource, cU as ExpenseItem, g1 as Subscription, bs as ContractCreate, cy as ContractUpdate, ct as ContractSummary, cu as ContractTicketPurchases, cv as ContractTicketPurchasesCreate, cx as ContractTicketPurchasesUpdate, cw as ContractTicketPurchasesSummary, cz as Country, cA as CountryCreate, cC as CountryUpdate, cB as CountrySummary, cD as Currency, cE as CurrencyCreate, cG as CurrencyUpdate, cF as CurrencySummary, cH as Department, cI as DepartmentCreate, cK as DepartmentUpdate, cJ as DepartmentSummary, cM as DomainRegistrar, cN as DomainRegistrarCreate, cP as DomainRegistrarUpdate, cO as DomainRegistrarSummary, d8 as GlobalEntityInformationResultModel, cV as ExpenseItemAttachment, cW as ExpenseItemAttachmentCreate, cY as ExpenseItemAttachmentUpdate, cX as ExpenseItemAttachmentSummary, cZ as ExpenseItemCreate, c$ as ExpenseItemUpdate, c_ as ExpenseItemSummary, d0 as ExpenseReport, d1 as ExpenseReportCreate, d3 as ExpenseReportUpdate, d2 as ExpenseReportSummary, db as HolidaySet, dc as HolidaySetCreate, de as HolidaySetUpdate, dd as HolidaySetSummary, d9 as Holiday, da as HolidayCreate, dg as HolidayUpdate, df as HolidaySummary, dh as InventoryProduct, di as InventoryProductCreate, dk as InventoryProductUpdate, dj as InventoryProductSummary, dl as InventoryStockedItemAdd, dm as InventoryStockedItemRemove, dn as InventoryStockedItemTransfer, dq as InvoiceCreate, dw as InvoiceUpdate, dr as InvoiceSummary, ds as InvoiceTemplate, dt as InvoiceTemplateCreate, dv as InvoiceTemplateUpdate, dy as ModuleAccessResultModel, dz as NotificationHistory, dA as NotificationHistoryCreate, dC as NotificationHistoryUpdate, dB as NotificationHistorySummary, dF as Opportunity, dO as OpportunityCreate, dQ as OpportunityUpdate, dP as OpportunitySummary, dG as OpportunityAttachment, dH as OpportunityAttachmentCreate, dJ as OpportunityAttachmentUpdate, dI as OpportunityAttachmentSummary, dK as OpportunityCategory, dL as OpportunityCategoryCreate, dN as OpportunityCategoryUpdate, dM as OpportunityCategorySummary, dS as OrganizationalLevel1Create, dU as OrganizationalLevel1Update, dW as OrganizationalLevel2Create, dY as OrganizationalLevel2Update, d_ as OrganizationalLevelAssociationCreate, e0 as OrganizationalLevelAssociationUpdate, e2 as Phase, e3 as PhaseCreate, e5 as PhaseUpdate, e4 as PhaseSummary, e6 as Product, e7 as ProductCreate, e9 as ProductUpdate, e8 as ProductSummary, ea as ProductVendors, eb as ProductVendorsCreate, ed as ProductVendorsUpdate, ec as ProductVendorsSummary, ef as ProjectCharge, eg as ProjectChargeCreate, ei as ProjectChargeUpdate, eh as ProjectChargeSummary, el as ProjectNote, em as ProjectNoteCreate, eo as ProjectNoteUpdate, en as ProjectNoteSummary, ek as ProjectCreate, eq as ProjectUpdate, ep as ProjectSummary, hX as CompositeContextOptions, ej as ProjectContext, er as PurchaseApprovals, es as PurchaseApprovalsCreate, eu as PurchaseApprovalsUpdate, et as PurchaseApprovalsSummary, ev as PurchaseOrderItemReceiving, ew as PurchaseOrderItemReceivingCreate, ey as PurchaseOrderItemReceivingUpdate, ex as PurchaseOrderItemReceivingSummary, ez as PurchaseOrderItems, eA as PurchaseOrderItemsCreate, eC as PurchaseOrderItemsUpdate, eB as PurchaseOrderItemsSummary, eD as PurchaseOrders, eE as PurchaseOrdersCreate, eG as PurchaseOrdersUpdate, eF as PurchaseOrdersSummary, eJ as QuoteItem, eK as QuoteItemCreate, eM as QuoteItemUpdate, eL as QuoteItemSummary, eN as QuoteLocation, eO as QuoteLocationCreate, eQ as QuoteLocationUpdate, eP as QuoteLocationSummary, eH as Quote, eI as QuoteCreate, eW as QuoteUpdate, eR as QuoteSummary, eS as QuoteTemplate, eT as QuoteTemplateCreate, eV as QuoteTemplateUpdate, eU as QuoteTemplateSummary, f1 as ResourceRoleQueue, f2 as ResourceRoleQueueCreate, f4 as ResourceRoleQueueUpdate, f3 as ResourceRoleQueueSummary, e$ as ResourceRole, f0 as ResourceRoleCreate, f6 as ResourceRoleUpdate, f5 as ResourceRoleSummary, f7 as ResourceSkill, f8 as ResourceSkillCreate, fa as ResourceSkillUpdate, f9 as ResourceSkillSummary, hg as TicketCreate, hC as TicketUpdate, hB as TicketSummary, hf as TicketContext, fD as ServiceCallTaskResource, fB as ServiceCallTask, fk as ResourceTimeOffBalance, hP as TimeOffRequest, e_ as ResourceCreate, fo as ResourceUpdate, fb as ResourceSummary, fc as ResourceTimeOffAdditional, fd as ResourceTimeOffAdditionalCreate, ff as ResourceTimeOffAdditionalUpdate, fe as ResourceTimeOffAdditionalSummary, fg as ResourceTimeOffApprover, fh as ResourceTimeOffApproverCreate, fj as ResourceTimeOffApproverUpdate, fi as ResourceTimeOffApproverSummary, fl as ResourceTimeOffBalanceCreate, fn as ResourceTimeOffBalanceUpdate, fm as ResourceTimeOffBalanceSummary, fp as Role, fq as RoleCreate, fs as RoleUpdate, fr as RoleSummary, ft as SalesOrder, fu as SalesOrderCreate, fw as SalesOrderUpdate, fy as ServiceCall, fJ as ServiceCallTicket, fz as ServiceCallCreate, fR as ServiceCallUpdate, fA as ServiceCallSummary, fE as ServiceCallTaskResourceCreate, fG as ServiceCallTaskResourceUpdate, fF as ServiceCallTaskResourceSummary, fC as ServiceCallTaskCreate, fI as ServiceCallTaskUpdate, fH as ServiceCallTaskSummary, fL as ServiceCallTicketResource, fM as ServiceCallTicketResourceCreate, fO as ServiceCallTicketResourceUpdate, fN as ServiceCallTicketResourceSummary, fK as ServiceCallTicketCreate, fQ as ServiceCallTicketUpdate, fP as ServiceCallTicketSummary, fT as ServiceLevelAgreementResults, fU as ServiceLevelAgreementResultsCreate, fW as ServiceLevelAgreementResultsUpdate, fV as ServiceLevelAgreementResultsSummary, fx as Service, fS as ServiceCreate, fY as ServiceUpdate, fX as ServiceSummary, fZ as Skill, f_ as SkillCreate, g0 as SkillUpdate, f$ as SkillSummary, g3 as SubscriptionPeriod, g4 as SubscriptionPeriodCreate, g6 as SubscriptionPeriodUpdate, g5 as SubscriptionPeriodSummary, g2 as SubscriptionCreate, g8 as SubscriptionUpdate, g7 as SubscriptionSummary, gb as SurveyResults, gc as SurveyResultsCreate, ge as SurveyResultsUpdate, gd as SurveyResultsSummary, g9 as Survey, ga as SurveyCreate, gg as SurveyUpdate, gf as SurveySummary, gi as TagAlias, gj as TagAliasCreate, gl as TagAliasUpdate, gk as TagAliasSummary, gn as TagGroup, go as TagGroupCreate, gq as TagGroupUpdate, gp as TagGroupSummary, gh as Tag, gm as TagCreate, gs as TagUpdate, gr as TagSummary, gv as TaskSecondaryResource, gw as TaskSecondaryResourceCreate, gy as TaskSecondaryResourceUpdate, gx as TaskSecondaryResourceSummary, gt as Task, gu as TaskCreate, gA as TaskUpdate, gz as TaskSummary, gB as TaxRegion, gC as TaxRegionCreate, gE as TaxRegionUpdate, gF as ThresholdStatusResultModel, gH as TicketAdditionalConfigurationItem, gI as TicketAdditionalConfigurationItemCreate, gK as TicketAdditionalConfigurationItemUpdate, gJ as TicketAdditionalConfigurationItemSummary, gL as TicketAdditionalContact, gM as TicketAdditionalContactCreate, gO as TicketAdditionalContactUpdate, gN as TicketAdditionalContactSummary, gP as TicketAttachment, gQ as TicketAttachmentCreate, gS as TicketAttachmentUpdate, gR as TicketAttachmentSummary, gT as TicketCategory, gU as TicketCategoryCreate, g_ as TicketCategoryUpdate, gZ as TicketCategorySummary, gV as TicketCategoryFieldDefault, gW as TicketCategoryFieldDefaultCreate, gY as TicketCategoryFieldDefaultUpdate, gX as TicketCategoryFieldDefaultSummary, g$ as TicketChangeRequestApproval, h0 as TicketChangeRequestApprovalCreate, h2 as TicketChangeRequestApprovalUpdate, h1 as TicketChangeRequestApprovalSummary, h3 as TicketCharge, h4 as TicketChargeCreate, h6 as TicketChargeUpdate, h5 as TicketChargeSummary, h7 as TicketChecklistItem, h8 as TicketChecklistItemCreate, ha as TicketChecklistItemUpdate, h9 as TicketChecklistItemSummary, hb as TicketChecklistLibrary, hc as TicketChecklistLibraryCreate, he as TicketChecklistLibraryUpdate, hd as TicketChecklistLibrarySummary, hh as TicketHistory, hi as TicketHistoryCreate, hk as TicketHistoryUpdate, hj as TicketHistorySummary, hm as TicketNoteAttachment, hn as TicketNoteAttachmentCreate, hp as TicketNoteAttachmentUpdate, ho as TicketNoteAttachmentSummary, hl as TicketNote, hq as TicketNoteCreate, hs as TicketNoteUpdate, hr as TicketNoteSummary, ht as TicketNoteWebhook, hu as TicketNoteWebhookCreate, hw as TicketNoteWebhookUpdate, hv as TicketNoteWebhookSummary, hx as TicketSecondaryResource, hy as TicketSecondaryResourceCreate, hA as TicketSecondaryResourceUpdate, hz as TicketSecondaryResourceSummary, hD as TicketWebhook, hE as TicketWebhookCreate, hG as TicketWebhookUpdate, hF as TicketWebhookSummary, hM as TimeEntryCreate, hO as TimeEntryUpdate, hN as TimeEntrySummary, hI as TimeEntryAttachment, hJ as TimeEntryAttachmentCreate, hL as TimeEntryAttachmentUpdate, hK as TimeEntryAttachmentSummary, hQ as TimeOffRequestCreate, hT as TimeOffRequestUpdate, hS as TimeOffRequestSummary, A as ApiVersionResultModel, k as AutotaskVersionResultModel, hV as ZoneInformationResultModel } from './index-c549LvOb.cjs';
2
2
 
3
3
  /** Default bound of the read cache (a long-lived server must not grow without bound). */
4
4
  declare const READ_CACHE_MAX_ENTRIES = 4096;
@@ -176,8 +176,8 @@ interface AutotaskConfig {
176
176
  /**
177
177
  * Row label siblings on the read surfaces (issue #287): when `true`,
178
178
  * `query`/`queryBounded` (and the invoke `<resource>.query` path),
179
- * `operations.aggregate` group keys, `operations.fetchMany` and
180
- * `fetchByIds` add the `*Name` / `*Label` siblings to the served rows
179
+ * `operations.aggregate` group keys and `operations.fetchByIds` add the
180
+ * `*Name` / `*Label` siblings to the served rows
181
181
  * (picklist `<field>Label`, `<fk>Name` for the record-FK fields and the
182
182
  * staff name for `resourceID`/`*ResourceID`). Default `false` (raw ids —
183
183
  * the label pass costs a field-catalog read plus up to 20 cold name
@@ -738,20 +738,18 @@ declare class HttpClient {
738
738
  * update dry-run envelope (issue #14 — additive);
739
739
  * - src/http.ts attaches EMPTY_REASON_STAMPS / POINTER_NOTES to typed
740
740
  * errors (issue #14 — the reason rides on the error details, additive);
741
- * - operations.recovery reads DELETE_BOUNDARY_NOTES + MARKER_FIELDS
742
- * (issue #9 — zero wire);
743
741
  * - src/resources/base.ts reads RESPONSE_DRIFT_MARKERS on a drifted 2xx
744
742
  * create (issue #13 — ONE bounded marker read; absent pin = old behaviour);
745
- * - operations.blindSurfaces / operations.probeReachability serve
746
- * BLIND_SURFACE_INVENTORY + REACHABILITY_PROBE_DEFAULTS (issue #11 —
747
- * the inventory is zero wire; the probe is a bounded read sweep);
743
+ * - BLIND_SURFACE_INVENTORY + REACHABILITY_PROBE_DEFAULTS — the
744
+ * plan.reachability artifacts (issue #11); the ops that served them were
745
+ * deleted in #289, the plan data and the artifacts remain;
748
746
  * - operations.createGuidance serves CREATE_GUIDANCE (issue #12 — the
749
747
  * zone-fact create-guidance catalog, zero wire);
750
748
  * - src/resources/base.ts reads UNTRUSTED_FIELDS_BY_RESOURCE for the
751
749
  * queryBounded noteChars free-text cap (issue #61 — response-side only);
752
750
  * - docs/API.md §11.7/§11.8/§11.9/§11.10/§11.11/§11.12 render the same facts.
753
751
  *
754
- * planHash: 5c18b378722a038159564faccee795e7c278f048f30c77d77b5dc27e83ea2dee
752
+ * planHash: dc0c06eae0d75d77a9d41c50f8d9a4a7ce458f34e62aa1e7f9b5f35a487e4020
755
753
  */
756
754
 
757
755
  /** One pinned blind-surface stamp (the result-time sentinel object). */
@@ -767,44 +765,6 @@ interface BlindSurfaceInfo {
767
765
  /** The zone fact + remedy, LLM-consumer grade. */
768
766
  note: string;
769
767
  }
770
- /** One blind-surface inventory row (issue #11 — the served discovery row). */
771
- interface BlindSurfaceRow {
772
- /** The plan resource key. */
773
- resource: string;
774
- /** The affected read ops (the pinned subset of count/query that exist for the resource). */
775
- ops: Array<'count' | 'query'>;
776
- /** The blind class (closed set): unowned-blind | fully-blind | unfiltered-blind | unknown (no class assigned — data-full or no count observable). */
777
- kind: 'unowned-blind' | 'fully-blind' | 'unfiltered-blind' | 'unknown';
778
- /** The ww29 discovery fact: rows seen for the unfiltered limit-2 read (0 = blind; 1-2 = data-full; null = no count observable). */
779
- unfilteredRows: number | null;
780
- /** The authority op that answers for a record (e.g. companies.get); null when the plan has no get row. */
781
- authority: string | null;
782
- /** The discovery fact + remedy, LLM-consumer grade. */
783
- note: string;
784
- /** The proof level: live-verified | discovery-sweep | spec-derived. */
785
- proof: 'live-verified' | 'discovery-sweep' | 'spec-derived';
786
- }
787
- /** The blind-surface inventory (issue #11 — the served 116-surface artifact). */
788
- interface BlindSurfaceInventory {
789
- zone: string;
790
- label: string;
791
- verifiedAt: string | null;
792
- /** The discovery sweep date (the ww29 run). */
793
- discoveredAt: string | null;
794
- surfaces: BlindSurfaceRow[];
795
- counts: {
796
- total: number;
797
- dataFull: number;
798
- blind: number;
799
- pinned: number;
800
- };
801
- /** The resources the sweep found data-full (safe for unfiltered reads). */
802
- dataFull: string[];
803
- remedies: {
804
- generic: string;
805
- byResource: Record<string, string>;
806
- };
807
- }
808
768
  /** The create-blocker class (issue #12 — the closed 9-set; the gate re-derives). */
809
769
  type CreateBlockerKind = 'ok' | 'blind-reference' | 'blind-parent' | 'picklist-unexposed' | 'undocumented-ladder' | 'resource-role-pair' | 'delete-absent' | 'non-mutable' | 'unknown';
810
770
  /**
@@ -1020,10 +980,47 @@ interface RelationshipResource {
1020
980
  note: string;
1021
981
  proof: string;
1022
982
  } | null;
1023
- /** The spec-derived name-like field the recovery marker query filters on (issue #9; null = none). */
983
+ /** The spec-derived name-like marker field (issue #9; null = none). */
1024
984
  markerField: string | null;
1025
985
  }
1026
986
 
987
+ /** One hop's status: ok (record served), missing (the pointer is absent — or,
988
+ * for a level hop, the parent association row did not resolve so the pointer
989
+ * was never read), unresolved (the pointer exists but the vendor returned no
990
+ * record), capped (the read budget ran out before this hop was read). */
991
+ type LineOfBusinessMarker = 'ok' | 'missing' | 'unresolved' | 'capped';
992
+ /** The dedicated Line of Business chain section (issue: LOB resolution). */
993
+ interface LineOfBusinessNames {
994
+ /** Where the association id came from: the ticket's own pointer, or its contract's
995
+ * (the composite resolves the ticket -> contract fallback). Absent on other call sites. */
996
+ source?: 'ticket' | 'contract';
997
+ /** The contract consulted for the fallback, when `source` is 'contract'. */
998
+ contractId?: Identifier;
999
+ /** The association row when served, otherwise null. */
1000
+ association: OrganizationalLevelAssociation | null;
1001
+ /** The OrganizationalLevel2 row (the customizable "Line of Business" label), otherwise null. */
1002
+ organizationalLevel2: OrganizationalLevel2 | null;
1003
+ /** The OrganizationalLevel1 row (the division), otherwise null. */
1004
+ organizationalLevel1: OrganizationalLevel1 | null;
1005
+ /** Explicit per-hop markers — a broken chain is reported, never thrown. */
1006
+ markers: {
1007
+ association: LineOfBusinessMarker;
1008
+ organizationalLevel2: LineOfBusinessMarker;
1009
+ organizationalLevel1: LineOfBusinessMarker;
1010
+ };
1011
+ }
1012
+
1013
+ /** The `names` summary a labelled result carries ONLY when something was
1014
+ * left unlabelled: the cold-read cap was hit or a picklist could not be
1015
+ * resolved. Issue #287: the structured `truncated` / `capped` / catalogError
1016
+ * bookkeeping was trimmed — the note is the summary. */
1017
+ interface RowNamesSummary {
1018
+ /** One line a reader can act on. */
1019
+ note: string;
1020
+ /** Picklist field -> why its `*Label` is null (the fieldCatalog honesty note / the value-not-served note). */
1021
+ reasons?: Record<string, string>;
1022
+ }
1023
+
1027
1024
  /** Resource description handed to `BaseResource` (one instance per resource). */
1028
1025
  interface BaseResourceConfig {
1029
1026
  /** Plan key / registry name, e.g. 'companies'. */
@@ -1094,16 +1091,15 @@ interface BoundedQueryParams extends QueryParams {
1094
1091
  noteChars?: number;
1095
1092
  /**
1096
1093
  * Issue #287 (D6): the walk's TOTAL row cap — the bounded query SERVES
1097
- * at most `maxRows` rows in total (the bounding cap = `min(limit,
1098
- * maxRows)`); the page size stays `min(500, limit)`, so one vendor page
1094
+ * at most `maxRows` rows in total, independent of `limit`; the page
1095
+ * size stays `min(500, limit)`, so one vendor page
1099
1096
  * may fetch more rows than `maxRows` and the surplus is sliced off
1100
1097
  * (fetched, not served). Positive integer; absent = the `limit` cap
1101
1098
  * alone (bit-for-bit the pre-`walk` result). The result carries the
1102
- * `truncated` flag for this cap: `false` only when the cursor is
1103
- * exhausted, `true` iff more rows exist past the cap (so an
1104
- * exact-multiple count with a live next page reports `true` — a full
1105
- * final page sliced past the cap, or a live next cursor at the stop; no
1106
- * extra fetch either way). Not combinable with `latest` (the
1099
+ * `truncated` flag: `true` when the final page was sliced, a next cursor
1100
+ * remains, or the page guard stopped the walk; `false` for an exhausted
1101
+ * cursor with no surplus, even at exactly `maxRows`. No extra fetch
1102
+ * either way. Not combinable with `latest` (the
1107
1103
  * count-anchored mechanism has its own walk window).
1108
1104
  */
1109
1105
  walk?: {
@@ -1116,14 +1112,15 @@ interface BoundedQueryResult<T> {
1116
1112
  /** Total records returned (= items.length). */
1117
1113
  fetched: number;
1118
1114
  /**
1119
- * True when the walk was truncated (by the bounding cap — `limit`, or
1120
- * `min(limit, walk.maxRows)` — or the 1000-page guard) AND more records
1121
- * exist past the stop point: a non-null next cursor was seen at the
1122
- * stop, or the final page had to be sliced to meet the cap.
1115
+ * True when more records remain past the stop: a non-null next cursor
1116
+ * was seen, or the final page was sliced to meet the cap. Explicit walks
1117
+ * also report true whenever the 1000-page guard stops the walk.
1123
1118
  */
1124
1119
  hasMore: boolean;
1125
1120
  /** Pages fetched by the internal walk. */
1126
1121
  pagesWalked: number;
1122
+ /** Explicit labelled walks: present only when a page left names or picklist labels unresolved. */
1123
+ names?: RowNamesSummary;
1127
1124
  /**
1128
1125
  * Deliberately always omitted: the vendor documents `pageDetails.count` as
1129
1126
  * the CURRENT PAGE's record count (not a total), so it must never be
@@ -1232,7 +1229,7 @@ interface MutationOpts {
1232
1229
  * written; a 429 is still retried per `Retry-After` on the pre-#105
1233
1230
  * retriable set, GET/PUT/DELETE + flagged calls. The optional stale-object
1234
1231
  * guard's verification read keeps the client budget. Compound ops
1235
- * (`time_entries.createForResource`, `companies.upsertByName`) apply the
1232
+ * (e.g. `time_entries.moveToTicket`, `tickets.changeStatus`) apply the
1236
1233
  * override to the op's mutation send only — their pre-wire resolution
1237
1234
  * reads keep the client budget.)
1238
1235
  */
@@ -1341,10 +1338,13 @@ declare function toArray<T>(iter: AsyncIterable<T>): Promise<T[]>;
1341
1338
 
1342
1339
  /** Query-walk layer of `BaseResource` (issue #165): paging, bounded query, blind count, latest probes. */
1343
1340
  declare abstract class QueryBase<T = Record<string, unknown>> {
1344
- protected readonly http: HttpClient;
1341
+ private readonly httpClient;
1345
1342
  protected readonly config: BaseResourceConfig;
1346
1343
  /** Default page size for query walks (the client's resolved `pageSize`). */
1347
1344
  protected readonly defaultPageSize: number;
1345
+ /** The transport client behind this resource. Public: the hand-written special ops read
1346
+ * `resource.http` instead of taking a redundant `http` argument (issue #292). */
1347
+ get http(): HttpClient;
1348
1348
  /** Versioned global URL segment (from the config), e.g. '/V1.0/Companies'. */
1349
1349
  protected get resourcePath(): string;
1350
1350
  /** The vendor entity this resource's ids identify (issue #116 — the `details.idRefs` label, e.g. `company`). */
@@ -1387,7 +1387,8 @@ declare abstract class QueryBase<T = Record<string, unknown>> {
1387
1387
  * - `limit` = total records (default 500, hard max 2500 — above it throws
1388
1388
  * AutotaskConfigError; it is NOT a page size). The page-1 request uses
1389
1389
  * the internal page size min(500, limit) (the `latest` mechanism sizes
1390
- * its walk from the matching count); every follow-up page POSTs the
1390
+ * its walk from the matching count). Explicit `walk.maxRows` replaces
1391
+ * the total cap; `limit` then only sizes pages. Every follow-up page POSTs the
1391
1392
  * SAME QueryModel body (`buildQueryBody`: MaxRecords, IncludeFields and
1392
1393
  * the preserved filter) to the absolute cursor (issue #118 — the vendor
1393
1394
  * honours IncludeFields there and ignores MaxRecords, serving its own
@@ -1860,17 +1861,6 @@ declare class BillingItemApprovalLevelsResource extends BaseResource<BillingItem
1860
1861
  create(data: BillingItemApprovalLevelCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<BillingItemApprovalLevelCreate>>;
1861
1862
  }
1862
1863
 
1863
- /** The shared window opts shape (`TimeEntriesWindowOptions` is an alias of
1864
- * this type — `tz` is the issue #66 addition). */
1865
- interface DateWindowOptions {
1866
- /** Window anchor (default: now) — tests pin it for determinism. */
1867
- now?: Date;
1868
- /** Max records (default 500 = the hard cap — a call without limit takes the first 500 rows in vendor id order; a window with more than 500 matching rows needs the bounded query op with the same date-window filter — its 2500-row walk cap, issue #128). */
1869
- limit?: number;
1870
- /** IANA timezone (e.g. 'Australia/Sydney') — the window's calendar day/period is computed in that zone's local calendar and converted to UTC for the wire; omitted = UTC (the current behaviour, bit-for-bit). `last24h` is rolling and TZ-invariant (a zone never changes it). For the date-only `time_entries.dateWorked` the zone only picks the calendar dates; the wire bounds are whole UTC days of them (see `dateOnlyWindowBounds`). */
1871
- tz?: string;
1872
- }
1873
-
1874
1864
  /**
1875
1865
  * BillingItemsResource — BillingItems resource (G5 batch B, plan key 'billing_items').
1876
1866
  * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
@@ -1911,30 +1901,6 @@ declare class BillingItemsResource extends BaseResource<BillingItems, BillingIte
1911
1901
  resolve(identifier: number | string, opts?: {
1912
1902
  expand?: boolean;
1913
1903
  }): Promise<BillingItemsSummary | null>;
1914
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1915
- customRange(from: string, to: string, opts?: DateWindowOptions): Promise<BillingItems[]>;
1916
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1917
- last14(opts?: DateWindowOptions): Promise<BillingItems[]>;
1918
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1919
- last24h(opts?: DateWindowOptions): Promise<BillingItems[]>;
1920
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1921
- last30(opts?: DateWindowOptions): Promise<BillingItems[]>;
1922
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1923
- last7(opts?: DateWindowOptions): Promise<BillingItems[]>;
1924
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1925
- last90(opts?: DateWindowOptions): Promise<BillingItems[]>;
1926
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1927
- lastFullFortnight(opts?: DateWindowOptions): Promise<BillingItems[]>;
1928
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1929
- lastFullMonth(opts?: DateWindowOptions): Promise<BillingItems[]>;
1930
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1931
- lastFullQuarter(opts?: DateWindowOptions): Promise<BillingItems[]>;
1932
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1933
- lastFullWeek(opts?: DateWindowOptions): Promise<BillingItems[]>;
1934
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1935
- today(opts?: DateWindowOptions): Promise<BillingItems[]>;
1936
- /** Node-parity special op (hand-written in src/resources/special/billing_items.ts). */
1937
- yesterday(opts?: DateWindowOptions): Promise<BillingItems[]>;
1938
1904
  }
1939
1905
 
1940
1906
  /**
@@ -2114,14 +2080,6 @@ declare class ClassificationIconsResource extends BaseResource<ClassificationIco
2114
2080
  }): Promise<ClassificationIconSummary[]>;
2115
2081
  }
2116
2082
 
2117
- interface CompaniesDomainSearchOptions {
2118
- /** Node-parity knob: `'eq'` is mapped to `contains` (vendor has no exact
2119
- * domain operator for URL fields). Both values behave identically. */
2120
- searchType?: 'contains' | 'eq';
2121
- /** Max companies to return (default 25, clamped to 1..500). */
2122
- limit?: number;
2123
- }
2124
-
2125
2083
  interface CompanySearchOptions {
2126
2084
  /** Max companies to return (default 25, clamped to 1..500). */
2127
2085
  limit?: number;
@@ -2144,69 +2102,6 @@ interface CompanyFamilyRow extends Company {
2144
2102
  family?: CompanyFamily;
2145
2103
  }
2146
2104
 
2147
- interface CompaniesUpsertByNameParams {
2148
- /** The company phone (live-required on the ww29 create). */
2149
- phone: string;
2150
- /**
2151
- * The owner resource (REQUIRED on the create path — an active NON-API-only
2152
- * resource; the node cannot enumerate candidates: the resources table is
2153
- * blind to the API user). Absent + a dedup miss → the typed
2154
- * OWNER_RESOURCE_REQUIRED (zero wire, the remedy names the fixture-free fix).
2155
- */
2156
- ownerResourceID?: number;
2157
- /** The company type picklist (default 1 — the ww29-proven value). */
2158
- companyType?: number;
2159
- }
2160
- /** The typed blindSurface caveat (both the EXISTS and the CREATED results). */
2161
- interface CompaniesBlindSurfaceCaveat {
2162
- companies: true;
2163
- caveat: string;
2164
- /**
2165
- * The S12-C base-level typed sentinel (additive) — present when the dedup
2166
- * read hit the plan-pinned blind shape (zero items on companies.query).
2167
- */
2168
- sentinel?: BlindSurfaceInfo;
2169
- }
2170
- /** The typed EXISTS/CREATED result (blind-surface-aware). */
2171
- interface CompaniesUpsertByNameResult {
2172
- /** The company id (existing match or newly created). */
2173
- id: number;
2174
- /** False when the dedup match short-circuited the create. */
2175
- created: boolean;
2176
- /** The matched record (present when created is false). */
2177
- existing?: Company;
2178
- /** The dedup boundary carried IN the result (a query-miss is NOT proof of absence). */
2179
- blindSurface: CompaniesBlindSurfaceCaveat;
2180
- /** The vendor side effects reported on the created result (the V5 auto-location). */
2181
- sideEffects?: string[];
2182
- }
2183
-
2184
- /** One hop's status: ok (record served), missing (the pointer is absent — or,
2185
- * for a level hop, the parent association row did not resolve so the pointer
2186
- * was never read), unresolved (the pointer exists but the vendor returned no
2187
- * record), capped (the read budget ran out before this hop was read). */
2188
- type LineOfBusinessMarker = 'ok' | 'missing' | 'unresolved' | 'capped';
2189
- /** The dedicated Line of Business chain section (issue: LOB resolution). */
2190
- interface LineOfBusinessNames {
2191
- /** Where the association id came from: the ticket's own pointer, or its contract's
2192
- * (the composite resolves the ticket -> contract fallback). Absent on other call sites. */
2193
- source?: 'ticket' | 'contract';
2194
- /** The contract consulted for the fallback, when `source` is 'contract'. */
2195
- contractId?: Identifier;
2196
- /** The association row when served, otherwise null. */
2197
- association: OrganizationalLevelAssociation | null;
2198
- /** The OrganizationalLevel2 row (the customizable "Line of Business" label), otherwise null. */
2199
- organizationalLevel2: OrganizationalLevel2 | null;
2200
- /** The OrganizationalLevel1 row (the division), otherwise null. */
2201
- organizationalLevel1: OrganizationalLevel1 | null;
2202
- /** Explicit per-hop markers — a broken chain is reported, never thrown. */
2203
- markers: {
2204
- association: LineOfBusinessMarker;
2205
- organizationalLevel2: LineOfBusinessMarker;
2206
- organizationalLevel1: LineOfBusinessMarker;
2207
- };
2208
- }
2209
-
2210
2105
  /** One picklist entry of `TicketModel.status` (the vendor sends `value` as a string). */
2211
2106
  interface TicketStatusPicklistValue {
2212
2107
  id: number;
@@ -2401,6 +2296,14 @@ interface CrmPrepareResult {
2401
2296
  caveats: string[];
2402
2297
  }
2403
2298
 
2299
+ interface CompaniesDomainSearchOptions {
2300
+ /** Node-parity knob: `'eq'` is mapped to `contains` (vendor has no exact
2301
+ * domain operator for URL fields). Both values behave identically. */
2302
+ searchType?: 'contains' | 'eq';
2303
+ /** Max companies to return (default 25, clamped to 1..500). */
2304
+ limit?: number;
2305
+ }
2306
+
2404
2307
  /** The closed `source` set for `companies.unbilledWork`. */
2405
2308
  type UnbilledWorkSource = 'posted_uninvoiced' | 'invoice' | 'date_range' | 'tickets';
2406
2309
  /** Options for `unbilledWork` (closed bag; the pinned defaults). */
@@ -2566,9 +2469,9 @@ declare class CompaniesResource extends BaseResource<Company, CompanyCreate, Com
2566
2469
  /** Get the Company with its primary context records in one call (each part a single-record
2567
2470
  * fetch; no sub-lists; absent/dangling references come back null). */
2568
2471
  getContext(id: Identifier): Promise<CompanyContext>;
2569
- /** Node-parity special op (hand-written in src/resources/special/companies.ts). */
2472
+ /** Node-parity special op (hand-written in src/resources/special/companies/search.ts). */
2570
2473
  searchByDomain(domain: string, opts?: CompaniesDomainSearchOptions): Promise<Company[]>;
2571
- /** Node-parity special op (hand-written in src/resources/special/companies.ts). */
2474
+ /** Node-parity special op (hand-written in src/resources/special/companies/search.ts). */
2572
2475
  searchByIdentity(identity: {
2573
2476
  companyName?: string;
2574
2477
  email?: string;
@@ -2576,13 +2479,11 @@ declare class CompaniesResource extends BaseResource<Company, CompanyCreate, Com
2576
2479
  }, opts?: {
2577
2480
  limit?: number;
2578
2481
  }): Promise<Company[]>;
2579
- /** Node-parity special op (hand-written in src/resources/special/companies.ts). */
2580
- upsertByName(companyName: string, params: CompaniesUpsertByNameParams, opts?: MutationOpts): Promise<CompaniesUpsertByNameResult | DryRunResult<Record<string, unknown>>>;
2581
- /** Node-parity special op (hand-written in src/resources/special/companies.ts). */
2482
+ /** Node-parity special op (hand-written in src/resources/special/companies/fullProfile.ts). */
2582
2483
  fullProfile(id: Identifier, opts?: CompanyFullProfileOptions): Promise<CompanyFullProfile>;
2583
- /** Node-parity special op (hand-written in src/resources/special/companies.ts). */
2484
+ /** Node-parity special op (hand-written in src/resources/special/companies/unbilledWork.ts). */
2584
2485
  unbilledWork(id: Identifier, opts?: UnbilledWorkOptions): Promise<UnbilledWorkResult>;
2585
- /** Node-parity special op (hand-written in src/resources/special/companies.ts). */
2486
+ /** Node-parity special op (hand-written in src/resources/special/companies/prepareCrmWrite.ts). */
2586
2487
  prepareCrmWrite(input: CrmPrepareInput): Promise<CrmPrepareResult>;
2587
2488
  }
2588
2489
 
@@ -3491,14 +3392,17 @@ declare class ContactGroupsResource extends BaseResource<ContactGroups, ContactG
3491
3392
  }): Promise<ContactGroupsSummary[]>;
3492
3393
  }
3493
3394
 
3494
- /**
3495
- * Contacts special ops — node-parity `moveToCompany` (G4 batch A).
3496
- *
3497
- * The node's "move contact to company" composition: read the source contact,
3498
- * verify the destination company, abort when the email already exists under
3499
- * that company (the vendor's duplicate-email rule), create the contact under
3500
- * the destination, and optionally delete the source.
3501
- */
3395
+ /** One composite part\'s outcome: the value, or null + the typed absent reason. */
3396
+ interface CompositePartValue<TValue = unknown> {
3397
+ value: TValue | null;
3398
+ /** Present only when the part degraded (typed reason). */
3399
+ absent?: string;
3400
+ /** The tenant\'s closed-status set this part filtered on (the open-tickets parts only). */
3401
+ closedStatus?: {
3402
+ closedIds: number[];
3403
+ source: 'resolved';
3404
+ };
3405
+ }
3502
3406
 
3503
3407
  /**
3504
3408
  * `moveToCompany` options. Extends `MutationOpts` (G10b F1): `dryRun` and
@@ -3521,31 +3425,48 @@ interface MoveToCompanyResult {
3521
3425
  created: true;
3522
3426
  sourceDeleted: boolean;
3523
3427
  }
3524
- interface ContactsUpsertByEmailExtra {
3525
- /** Contact first name (default: the email local-part — the required-set gap the node fills). */
3526
- firstName?: string;
3527
- /** Contact last name (default: the non-empty neutral 'Unknown' — the ww29 create 500s on an empty lastName; S12-A live-verified). */
3528
- lastName?: string;
3529
- /**
3530
- * The zone quirk ABSORBED: a JSON boolean is ACCEPTED and mapped to the
3531
- * zone-correct number (true→1 / false→0); a raw 0/1 number passes through.
3532
- * Default: active (1).
3533
- */
3534
- isActive?: boolean | number;
3428
+ /** Options for `fullProfile` (all optional; the pinned defaults). */
3429
+ interface ContactFullProfileOptions {
3430
+ /** Max open-ticket records (default 50, 1-2500 — the server's `ticket_limit` bound). */
3431
+ ticketLimit?: number;
3535
3432
  }
3536
- /** The typed EXISTS/CREATED result (the requested taxonomy). */
3537
- interface ContactsUpsertByEmailResult {
3538
- /** The contact id (existing match or newly created). */
3539
- id: number;
3540
- /** False when the dedup match short-circuited the create. */
3541
- created: boolean;
3542
- /**
3543
- * The matched record (present when created is false). NOTE: emailAddress
3544
- * arrives [REDACTED] under the default redaction policy (the PII set) —
3545
- * the result is equality-proof by the server-side match, NOT by reading
3546
- * the email back.
3547
- */
3548
- existing?: ContactSummary;
3433
+ /**
3434
+ * The contact with its company and its open tickets in ONE call (issue #313):
3435
+ * the composite the MCP server served as `autotask_contact_full_profile`.
3436
+ *
3437
+ * TWO-STAGE root: the vendor endpoint is parent-scoped
3438
+ * (GET /V1.0/Companies/{parentId}/Contacts/{id}) and the SDK's `contacts.get`
3439
+ * declares TWO required positional args (parentId, id) — a flat single-arg
3440
+ * call can never satisfy it. Stage 1 resolves the FK with a single-record
3441
+ * query (the root read is NOT caught: a vendor fault on it fails the call
3442
+ * with the typed error; no row -> the typed NOT_FOUND for the contact id).
3443
+ * A contact with no company FK: the contact row itself is the root and the
3444
+ * company part degrades to `absent: 'NO_FK'` (the op never hard-fails on a
3445
+ * missing company).
3446
+ *
3447
+ * Parts (bounded reads through the registry seam):
3448
+ * - `company`: `companies.get [fk]` (the typed absent degradation on a miss).
3449
+ * - `open_tickets`: the open tickets for the contact id — the closed set is
3450
+ * the tenant's live status picklist (`tickets.statusSemantics` with
3451
+ * `allowAssumed: false`), never a literal; a composite that cannot tell
3452
+ * open from closed degrades the part to `absent: 'CLOSED_STATUS_UNRESOLVED'`
3453
+ * (with the `closedStatus` disclosure).
3454
+ *
3455
+ * The result is the served pre-marking shape `{ root, parts }`: the server
3456
+ * keeps its per-part untrusted marking on top, so the tool output is
3457
+ * field-for-field the composite the server served today. Wire: 1 stage-1
3458
+ * query + 1 root read (2-3 with the company part) + the open-tickets
3459
+ * resolution (status catalog, field-cached) + 1 tickets query.
3460
+ */
3461
+ interface ContactFullProfile {
3462
+ /** The contact (the parent-scoped root read, or the stage-1 row when the contact has no company FK). */
3463
+ root: Contact;
3464
+ parts: {
3465
+ /** The contact's company (the `companies.get` record), or the typed absent degradation (`NO_FK` when the contact has no company). */
3466
+ company: CompositePartValue<Company>;
3467
+ /** The contact's open tickets (the bounded `tickets.query` result envelope) + the `closedStatus` disclosure, or the typed absent degradation. */
3468
+ open_tickets: CompositePartValue<BoundedQueryResult<Ticket>>;
3469
+ };
3549
3470
  }
3550
3471
 
3551
3472
  /**
@@ -3605,7 +3526,7 @@ declare class ContactsResource extends BaseResource<Contact, ContactCreate, Cont
3605
3526
  /** Node-parity special op (hand-written in src/resources/special/contacts.ts). */
3606
3527
  moveToCompany(sourceContactId: Identifier, destinationCompanyId: Identifier, opts?: MoveToCompanyOptions): Promise<MoveToCompanyResult | DryRunResult<Record<string, unknown>>>;
3607
3528
  /** Node-parity special op (hand-written in src/resources/special/contacts.ts). */
3608
- upsertByEmail(companyID: Identifier, email: string, extra?: ContactsUpsertByEmailExtra, opts?: MutationOpts): Promise<ContactsUpsertByEmailResult | DryRunResult<Record<string, unknown>>>;
3529
+ fullProfile(id: Identifier, opts?: ContactFullProfileOptions): Promise<ContactFullProfile>;
3609
3530
  }
3610
3531
 
3611
3532
  /**
@@ -4506,6 +4427,33 @@ declare class ContractServiceUnitsResource extends BaseResource<ContractServiceU
4506
4427
  }): Promise<ContractServiceUnitSummary | null>;
4507
4428
  }
4508
4429
 
4430
+ /** Options for `fullProfile` (all optional; the pinned defaults). */
4431
+ interface ContractFullProfileOptions {
4432
+ /** Max service records (default 50, 1-2500 — the server's `service_limit` bound). */
4433
+ serviceLimit?: number;
4434
+ /** Max billing-rule records (default 50, 1-2500 — the server's `billing_rule_limit` bound). */
4435
+ billingRuleLimit?: number;
4436
+ }
4437
+ /**
4438
+ * The contract with its services, billing rules, recent charges and service
4439
+ * units in ONE call (issue #313). See the module doc for the root/part
4440
+ * semantics, the fixed recent-N charges part and the fixed units cap.
4441
+ */
4442
+ interface ContractFullProfile {
4443
+ /** The contract record (the root read). */
4444
+ root: Contract;
4445
+ parts: {
4446
+ /** The contract's services (the bounded `contract_services.query` result envelope), or the typed absent degradation. */
4447
+ services: CompositePartValue<BoundedQueryResult<ContractService>>;
4448
+ /** The contract's billing rules (the bounded `contract_billing_rules.query` result envelope), or the typed absent degradation. */
4449
+ billing_rules: CompositePartValue<BoundedQueryResult<ContractBillingRule>>;
4450
+ /** The N newest charges (the count-anchored `latest` CHARGES_RECENT_CAP envelope), or the typed absent degradation. */
4451
+ charges: CompositePartValue<BoundedQueryResult<ContractCharge>>;
4452
+ /** The service units (the bounded `contract_service_units.query` envelope at the fixed SERVICE_UNITS_CAP), or the typed absent degradation. */
4453
+ units: CompositePartValue<BoundedQueryResult<ContractServiceUnit>>;
4454
+ };
4455
+ }
4456
+
4509
4457
  /** The full LOB chain for one contract. */
4510
4458
  interface ContractLineOfBusinessResult {
4511
4459
  contractId: Identifier;
@@ -4531,10 +4479,10 @@ type ProfitabilityLabourCostMethod = 'billing_item_our_cost' | 'contract_role_co
4531
4479
  /** A ladder rung that actually carried rows (plus 'missing'). */
4532
4480
  type ProfitRateSource = 'billing_item.ourCost' | 'contract_role_costs.rate' | 'resource.internalCost' | 'provided' | 'missing';
4533
4481
  interface ProfitabilityOptions {
4534
- /** Window start, YYYY-MM-DD (REQUIRED). */
4535
- dateFrom: string;
4536
- /** Window end, YYYY-MM-DD, >= dateFrom (REQUIRED). */
4537
- dateTo: string;
4482
+ /** Window start, YYYY-MM-DD. Optional pair with dateTo: BOTH omitted → the window defaults to the last full calendar month (UTC) and the result's period carries defaulted + note; exactly ONE supplied → typed CONFIG_ERROR (a half window is never sent). */
4483
+ dateFrom?: string;
4484
+ /** Window end, YYYY-MM-DD, >= dateFrom. Optional pair with dateFrom (same contract). */
4485
+ dateTo?: string;
4538
4486
  /** The ladder rung rows start from (default 'billing_item_our_cost'; row-level fallback walks down). */
4539
4487
  labourCostMethod?: ProfitabilityLabourCostMethod;
4540
4488
  /** The caller-supplied labour rate; REQUIRED when labourCostMethod is 'provided'; optional final-rung catch-all otherwise. */
@@ -4724,6 +4672,10 @@ interface ContractsProfitabilityResult {
4724
4672
  dateTo: string;
4725
4673
  months: string[];
4726
4674
  asOf: string;
4675
+ /** true only when dateFrom/dateTo were both omitted and the window defaulted (to the last full calendar month, UTC). */
4676
+ defaulted?: boolean;
4677
+ /** Present only when defaulted: the windowDefaulted note (month label + UTC basis). */
4678
+ note?: string;
4727
4679
  };
4728
4680
  currency: {
4729
4681
  companyCurrencyID: number | null;
@@ -4832,10 +4784,12 @@ declare class ContractsResource extends BaseResource<Contract, ContractCreate, C
4832
4784
  search(query: string, opts?: {
4833
4785
  limit?: number;
4834
4786
  }): Promise<ContractSummary[]>;
4835
- /** Node-parity special op (hand-written in src/resources/special/contracts.ts). */
4787
+ /** Node-parity special op (hand-written in src/resources/special/contracts/profitability.ts). */
4836
4788
  profitability(id: Identifier, opts: ProfitabilityOptions): Promise<ContractsProfitabilityResult>;
4837
- /** Node-parity special op (hand-written in src/resources/special/contracts.ts). */
4789
+ /** Node-parity special op (hand-written in src/resources/special/contracts/lineOfBusiness.ts). */
4838
4790
  lineOfBusiness(contractId: Identifier, associationId?: Identifier): Promise<ContractLineOfBusinessResult>;
4791
+ /** Node-parity special op (hand-written in src/resources/special/contracts/fullProfile.ts). */
4792
+ fullProfile(id: Identifier, opts?: ContractFullProfileOptions): Promise<ContractFullProfile>;
4839
4793
  }
4840
4794
 
4841
4795
  /**
@@ -5414,35 +5368,11 @@ declare class InvoicesResource extends BaseResource<Invoice, InvoiceCreate, Invo
5414
5368
  expand?: boolean;
5415
5369
  }): Promise<InvoiceSummary | null>;
5416
5370
  /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5417
- customRange(from: string, to: string, opts?: DateWindowOptions): Promise<Invoice[]>;
5418
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5419
- last14(opts?: DateWindowOptions): Promise<Invoice[]>;
5420
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5421
- last24h(opts?: DateWindowOptions): Promise<Invoice[]>;
5422
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5423
- last30(opts?: DateWindowOptions): Promise<Invoice[]>;
5424
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5425
- last7(opts?: DateWindowOptions): Promise<Invoice[]>;
5426
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5427
- last90(opts?: DateWindowOptions): Promise<Invoice[]>;
5428
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5429
- lastFullFortnight(opts?: DateWindowOptions): Promise<Invoice[]>;
5430
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5431
- lastFullMonth(opts?: DateWindowOptions): Promise<Invoice[]>;
5432
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5433
- lastFullQuarter(opts?: DateWindowOptions): Promise<Invoice[]>;
5434
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5435
- lastFullWeek(opts?: DateWindowOptions): Promise<Invoice[]>;
5436
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5437
5371
  markupHtml(id: Identifier): Promise<string>;
5438
5372
  /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5439
5373
  markupXml(id: Identifier): Promise<string>;
5440
5374
  /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5441
5375
  pdf(id: Identifier): Promise<Buffer>;
5442
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5443
- today(opts?: DateWindowOptions): Promise<Invoice[]>;
5444
- /** Node-parity special op (hand-written in src/resources/special/invoices.ts). */
5445
- yesterday(opts?: DateWindowOptions): Promise<Invoice[]>;
5446
5376
  }
5447
5377
 
5448
5378
  /**
@@ -6325,6 +6255,33 @@ declare class QuoteLocationsResource extends BaseResource<QuoteLocation, QuoteLo
6325
6255
  }): Promise<QuoteLocationSummary | null>;
6326
6256
  }
6327
6257
 
6258
+ /** Options for `withItems` (all optional; the pinned defaults). */
6259
+ interface QuoteWithItemsOptions {
6260
+ /** Max line-item records (default 50, 1-2500 — the server's `item_limit` bound). */
6261
+ itemLimit?: number;
6262
+ }
6263
+ /**
6264
+ * The quote with its line items in ONE call (issue #313): the composite the
6265
+ * MCP server served as `autotask_quote_get` (the plain `quotes.get` stays the
6266
+ * vendor read). The quote is the ROOT (a missing quote fails the call with
6267
+ * the typed NOT_FOUND); the items PART is the bounded fan-out
6268
+ * (`quote_items.query` filtered on `quoteID eq`), degrading independently to
6269
+ * `{ value: null, absent: <code> }`.
6270
+ *
6271
+ * The result is the served pre-marking shape `{ root, parts }`: the server
6272
+ * keeps its per-part untrusted marking on top, so the tool output is
6273
+ * field-for-field the composite the server served today. Wire: 1 root read +
6274
+ * 1 bounded query (1 page common case).
6275
+ */
6276
+ interface QuoteWithItems {
6277
+ /** The quote record (the root read). */
6278
+ root: Quote;
6279
+ parts: {
6280
+ /** The line items (the bounded `quote_items.query` result envelope), or the typed absent degradation. */
6281
+ items: CompositePartValue<BoundedQueryResult<QuoteItem>>;
6282
+ };
6283
+ }
6284
+
6328
6285
  /**
6329
6286
  * QuotesResource — Quote resource (G4 batch A, plan key 'quotes').
6330
6287
  * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
@@ -6374,6 +6331,8 @@ declare class QuotesResource extends BaseResource<Quote, QuoteCreate, QuoteUpdat
6374
6331
  search(query: string, opts?: {
6375
6332
  limit?: number;
6376
6333
  }): Promise<QuoteSummary[]>;
6334
+ /** Node-parity special op (hand-written in src/resources/special/quotes.ts). */
6335
+ withItems(id: Identifier, opts?: QuoteWithItemsOptions): Promise<QuoteWithItems>;
6377
6336
  }
6378
6337
 
6379
6338
  /**
@@ -6529,213 +6488,248 @@ declare class ResourceSkillsResource extends BaseResource<ResourceSkill, Resourc
6529
6488
  }): Promise<ResourceSkillSummary | null>;
6530
6489
  }
6531
6490
 
6532
- interface TransferOwnershipOptions {
6533
- /** Default `true`: list the changes, issue no update. */
6534
- dryRun?: boolean;
6535
- /**
6536
- * Issue #105: the per-call retry budget for the per-company PUTs. `0` =
6537
- * exactly one send per company, no auto-retry; omitted = the client's
6538
- * configured `maxRetries`.
6539
- */
6540
- maxRetries?: number;
6541
- }
6542
- interface OwnershipChange {
6543
- /** The company id being re-owned. */
6544
- id: Identifier;
6545
- /** Current owner (null when the vendor omits it). */
6546
- fromOwnerResourceID: number | null;
6547
- /** The destination resource id every change applies. */
6548
- toOwnerResourceID: Identifier;
6491
+ interface TicketChangeStatusResult {
6492
+ ticketId: Identifier;
6493
+ previousStatus: number | null;
6494
+ /** The post-PUT read-back value (verified === targetStatus or the op throws). */
6495
+ status: number;
6496
+ changed: true;
6497
+ /** The map-required fields the node filled with proven-safe defaults. */
6498
+ filledFields: string[];
6499
+ /** Discovery-merge count applied on PUT 500s (0 = first-try PUT). */
6500
+ discoveryMerges: number;
6549
6501
  }
6550
- interface TransferOwnershipResult {
6551
- /** `true` when no update was issued. */
6552
- dryRun: boolean;
6553
- /** One entry per id, in the given order. */
6554
- changes: OwnershipChange[];
6502
+ interface TicketChangeStatusNoChange {
6503
+ ticketId: Identifier;
6504
+ changed: false;
6505
+ status: number;
6506
+ reason: 'NO_CHANGE';
6555
6507
  }
6508
+
6556
6509
  /**
6557
- * The pinned dry-run envelope for `transferOwnership` (G10b F2) + the
6558
- * from→to list the gateway wants (`changes` — an additive field on top of
6559
- * the pinned shape, present in both modes).
6510
+ * One route fact on a composite child part that the default global `/query`
6511
+ * route did not serve (issue #35): the route attempted, the path it
6512
+ * attempted, and the HTTP status that failed it (null when the failure was
6513
+ * not an HTTP status — a shape or transport fault).
6560
6514
  */
6561
- interface TransferOwnershipDryRunResult extends DryRunResult<OwnershipChange[]> {
6562
- /** One entry per id, in the given order (the from→to list). */
6563
- changes: OwnershipChange[];
6515
+ interface TicketChildRouteFact {
6516
+ /** The route that was attempted (the plan-declared scoped collection read is 'scoped'). */
6517
+ route: 'global' | 'scoped';
6518
+ /** The path the route attempted (e.g. '/V1.0/TicketNotes/query' or '/V1.0/Tickets/527119/Notes'). */
6519
+ path: string;
6520
+ /** The HTTP status that failed the route (null for a non-HTTP failure). */
6521
+ httpStatus: number | null;
6564
6522
  }
6565
6523
 
6524
+ /** Options for `fullContext` (all optional; the pinned defaults). */
6525
+ interface TicketFullContextOptions {
6526
+ /** Max note records (default 50). */
6527
+ noteLimit?: number;
6528
+ /** Max time-entry records (default 50). */
6529
+ timeEntryLimit?: number;
6530
+ /** Include the attachments part (default true) — METADATA only (ids + names); data download stays a separate op. */
6531
+ includeAttachments?: boolean;
6532
+ /** Include the histories part (default false — budget control). */
6533
+ includeHistories?: boolean;
6534
+ /** Long note/history text is truncated to this many chars in the served copy and flagged (default 500). */
6535
+ textLimit?: number;
6536
+ /** Opt-in name/label siblings (issue #77; default OFF — the sibling keys are ABSENT, not null, and no name/label resolution runs: zero added wire, byte-identical output). ON: the ticket row and each time-entry row carry the closed-scope siblings (the ticket picklist labels — status / priority / ticketType / issueType / subIssueType / source / queue — plus the contract / billing-code / role record-FK names and the resource names — creator + the time-entry resource) and the top-level `names` section. */
6537
+ names?: boolean;
6538
+ /** May LOWER the composite's name-read budget (default 20 — the count of COLD wire reads issued for name resolution; cache hits are free of the budget). The caller may lower it, never raise it; over-budget ids serve `name: null` and the names section sets `truncated: true` (never an error). */
6539
+ maxNameReads?: number;
6540
+ }
6541
+ /** One capped list part (a full page sets `capped: true` — more may exist). */
6542
+ interface TicketFullContextPart<TItem = Record<string, unknown>> {
6543
+ items: TItem[];
6544
+ /** True when the part returned a full page (the vendor query has no sort — more may exist past the cap). */
6545
+ capped: boolean;
6546
+ /** Present only when the part was served by the plan-declared parent-scoped route (issue #35: the global /query route 404/500'd in this zone). Absent when the default global route served the part (working-zone shape unchanged). */
6547
+ route?: 'scoped';
6548
+ /** Present only when the part status is 'miss' (issue #35): every declared route attempted, in attempt order. The part serves no items; the call itself succeeds (a part miss never fails the op — the same rule as the FK 'absent' parts). */
6549
+ routeFacts?: TicketChildRouteFact[];
6550
+ }
6551
+ /** The attachments part is METADATA only (data download stays a separate op). */
6552
+ interface TicketFullContextAttachments {
6553
+ ids: number[];
6554
+ /** The attachment `title` (null when absent). */
6555
+ names: Array<string | null>;
6556
+ capped: boolean;
6557
+ route?: 'scoped';
6558
+ routeFacts?: TicketChildRouteFact[];
6559
+ }
6566
6560
  /**
6567
- * ResourcesResource — Resource resource (G5 batch B, plan key 'resources').
6568
- * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
6569
- * Do not hand-edit; re-run the generator (the plan is the source of truth).
6561
+ * The full ticket context in ONE call (plan T3): the ticket + its context
6562
+ * parts (the proven `getContext` 5-part composite — dangling FKs come back
6563
+ * null and are reported in `parts`, a part miss never fails the op) + its
6564
+ * notes, time entries, attachment metadata and (opt-in) histories via the
6565
+ * timeline's bounded query machinery. 8 bounded reads (10 with
6566
+ * `includeHistories`); zero mutating. The ticket itself missing → the
6567
+ * `getContext` NotFoundError propagates.
6570
6568
  */
6571
-
6572
- /** Query params for ResourcesResource (the G3 filter surface; no per-resource invention). */
6573
- type ResourcesResourceQueryParams = QueryParams;
6574
- declare class ResourcesResource extends BaseResource<Resource, ResourceCreate, ResourceUpdate> {
6575
- private readonly clientConfig;
6576
- constructor(http: HttpClient, clientConfig: ResolvedAutotaskConfig, pageSize: number);
6577
- /** Query Resource records with the G3 filter surface (server-side JSON filter). */
6578
- query(params?: ResourcesResourceQueryParams): AsyncIterable<Resource>;
6579
- /** Get every Resource record (the MCP-preferred read; 1000-page guarded). */
6580
- queryAll(params?: ResourcesResourceQueryParams): Promise<Resource[]>;
6581
- /** Count matching records (queryCount envelope unwrapped to a plain number). */
6582
- count(params?: ResourcesResourceQueryParams): Promise<number>;
6583
- /** Get one record by id (item envelope; item: null → NotFoundError). `fresh: true` bypasses the read-cache lookup and refreshes the entry (issue #250). */
6584
- get(id: Identifier, opts?: {
6585
- fresh?: boolean;
6586
- } | null): Promise<Resource>;
6587
- /** Update a record (PUT on the COLLECTION — the vendored spec's item path is GET-only; the vendor
6588
- * keys the record by the id in the body). The vendor validates the FULL model on this route (V2), so a
6589
- * partial body is merged into the CURRENT record first: one fresh GET (which also serves the
6590
- * stale-object guard's read) then the collection PUT of the merged model — an explicit null in the
6591
- * caller body sends null; an omitted field keeps the current value. `raw: true` in the opts bag sends
6592
- * the body as-is (full model or intentional partial — the compatibility escape hatch; no merge read).
6593
- * `dryRun: true` returns the pinned envelope whose `data` is the merged body (the exact confirmed
6594
- * wire) with the best-effort diff, from that same single read; a caller-supplied lastModifiedDate that
6595
- * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
6596
- update(id: Identifier, data: ResourceUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<ResourceUpdate>>;
6597
- /** Resolve a Resource from a numeric id (or, where the vendor indexes a primary text field,
6598
- * from an exact match on firstName / lastName). A numeric id miss throws NOT_FOUND; a complete
6599
- * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
6600
- * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
6601
- * The compact shape is the structural alias of the full record; `expand: true` is the
6602
- * type-level escape hatch. */
6603
- resolve(identifier: number | string, opts?: {
6604
- expand?: boolean;
6605
- }): Promise<ResourceSummary | null>;
6606
- /** Search Resource records: bounded contains on firstName + lastName (no vendor free-text search exists);
6607
- * limit defaults to 25, max 500. */
6608
- search(query: string, opts?: {
6609
- limit?: number;
6610
- }): Promise<ResourceSummary[]>;
6611
- /** Node-parity special op (hand-written in src/resources/special/resources.ts). */
6612
- transferOwnership(sourceResourceIds: Identifier[], destinationResourceId: Identifier, opts?: TransferOwnershipOptions): Promise<TransferOwnershipResult | TransferOwnershipDryRunResult>;
6613
- /** Node-parity special op (hand-written in src/resources/special/resources.ts). */
6614
- whoAmI(): Promise<ResourceSummary | null>;
6569
+ interface TicketFullContext {
6570
+ ticket: Ticket;
6571
+ /** Null when the ticket carries no companyID (or the record misses). */
6572
+ company: Company | null;
6573
+ /** Null when the ticket carries no contactID (or the record misses). */
6574
+ contact: Contact | null;
6575
+ /** Null when the ticket carries no assignedResourceID (or the record misses). */
6576
+ assignedResource: Resource | null;
6577
+ /** Null when the ticket carries no projectID (or the record misses). */
6578
+ project: Project | null;
6579
+ notes: TicketFullContextPart;
6580
+ timeEntries: TicketFullContextPart;
6581
+ /** Present when `includeAttachments` is not false (default: present). */
6582
+ attachments: TicketFullContextAttachments;
6583
+ /** Present only when `includeHistories: true`. */
6584
+ histories?: TicketFullContextPart;
6585
+ /** True when ANY part hit its cap (more may exist past the cap) — or any name read hit the name-read budget (issue #77, `names: true`). */
6586
+ truncated: boolean;
6587
+ /** The opt-in name/label section (issue #77) — present EXACTLY when `names: true` (the sibling keys are absent from the rows otherwise). */
6588
+ names?: CompositeNamesSection;
6589
+ /** The Line of Business chain that applies to this ticket — present EXACTLY when `names: true`. Resolved from the ticket's own `organizationalLevelAssociationID` when set, otherwise from the ticket's CONTRACT's pointer (`source: 'contract'`, `contractId` says which; the association is maintained on contracts in practice, so this is the common path). The three hops: the OrganizationalLevelAssociation, the OrganizationalLevel2 (the customizable "Line of Business" label) and the OrganizationalLevel1 (the division). An absent pointer anywhere is reported with all-`missing` markers; a dangling record is `unresolved`; a broken chain is never an error. Costs 1 association + up to 2 level reads inside `maxNameReads`, plus one cached contract read when the fallback runs. */
6590
+ lineOfBusiness?: LineOfBusinessNames;
6591
+ /** Per-part status: FK parts 'ok' | 'absent' (dangling/missing FK); list parts 'ok' (served by the global /query route — a 0-row filtered query is a legitimate answer), 'ok-scoped' (issue #35: the plan-declared scoped route served the part because the global route 404/500'd in this zone — only where the plan declares a scoped route), or 'miss' (issue #35: every declared route failed; the part serves no items, recorded in the part's routeFacts). */
6592
+ parts: {
6593
+ company: 'ok' | 'absent';
6594
+ contact: 'ok' | 'absent';
6595
+ assignedResource: 'ok' | 'absent';
6596
+ project: 'ok' | 'absent';
6597
+ notes: 'ok' | 'ok-scoped' | 'miss';
6598
+ timeEntries: 'ok' | 'ok-scoped' | 'miss';
6599
+ attachments: 'ok' | 'ok-scoped' | 'miss';
6600
+ histories?: 'ok' | 'ok-scoped' | 'miss';
6601
+ };
6615
6602
  }
6616
6603
 
6617
- /**
6618
- * ResourceTimeOffAdditionalResource — ResourceTimeOffAdditional resource (G5 batch B, plan key 'resource_time_off_additional').
6619
- * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
6620
- * Do not hand-edit; re-run the generator (the plan is the source of truth).
6621
- * Parent-scoped child of 'resources': CRUD under /V1.0/Resources/{parentId}/TimeOffAdditional —
6622
- * the global query/count stay unscoped (narrow with the 'resourceID' filter).
6623
- */
6624
-
6625
- /** Query params for ResourceTimeOffAdditionalResource (the G3 filter surface; no per-resource invention). */
6626
- type ResourceTimeOffAdditionalResourceQueryParams = QueryParams;
6627
- declare class ResourceTimeOffAdditionalResource extends BaseResource<ResourceTimeOffAdditional, ResourceTimeOffAdditionalCreate, ResourceTimeOffAdditionalUpdate> {
6628
- constructor(http: HttpClient, pageSize: number);
6629
- /** Update a record under the parent (PATCH on the collection — swagger documents put+patch there;
6630
- * the vendor keys the record by the id in the body; OperationResultModel → { id}). `dryRun: true` returns
6631
- * the pinned envelope with the best-effort diff; a caller-supplied lastModifiedDate that
6632
- * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
6633
- update(parentId: Identifier, id: Identifier, data: ResourceTimeOffAdditionalUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<ResourceTimeOffAdditionalUpdate>>;
6634
- /** Resolve a ResourceTimeOffAdditional from a numeric id (or, where the vendor indexes a primary text field,
6635
- * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
6636
- * a bare value rejects with a config error (ids only);
6637
- * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
6638
- * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
6639
- * The compact shape is the structural alias of the full record; `expand: true` is the
6640
- * type-level escape hatch. */
6641
- resolve(identifier: number | string, opts?: {
6642
- expand?: boolean;
6643
- }): Promise<ResourceTimeOffAdditionalSummary | null>;
6644
- /** Node-parity special op (hand-written in src/resources/special/resource_time_off_additional.ts). */
6645
- getByResource(resourceId: Identifier): Promise<ResourceTimeOffAdditional[]>;
6604
+ /** The full LOB chain for one ticket. */
6605
+ interface TicketLineOfBusinessResult {
6606
+ ticketId: Identifier;
6607
+ /** Where the association id came from: the ticket's own pointer, its contract's, the caller's argument, or null when none was found. */
6608
+ associationSource: 'ticket' | 'contract' | 'argument' | null;
6609
+ /** The contract consulted for the fallback (null when the ticket pointer or the argument supplied the id). */
6610
+ contractId: Identifier | null;
6611
+ /** The association row when served, otherwise null. */
6612
+ association: OrganizationalLevelAssociation | null;
6613
+ /** The OrganizationalLevel2 row (the customizable "Line of Business" label), otherwise null. */
6614
+ organizationalLevel2: OrganizationalLevel2 | null;
6615
+ /** The OrganizationalLevel1 row (the division), otherwise null. */
6616
+ organizationalLevel1: OrganizationalLevel1 | null;
6617
+ /** Explicit per-hop markers — a broken chain is reported, never thrown.
6618
+ * `capped` cannot occur on this op: its fixed budget always covers the full
6619
+ * chain (1 association + up to 2 level reads). */
6620
+ markers: {
6621
+ association: LineOfBusinessMarker;
6622
+ organizationalLevel2: LineOfBusinessMarker;
6623
+ organizationalLevel1: LineOfBusinessMarker;
6624
+ };
6646
6625
  }
6647
6626
 
6648
- /**
6649
- * ResourceTimeOffApproversResource — ResourceTimeOffApprover resource (G5 batch B, plan key 'resource_time_off_approvers').
6650
- * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
6651
- * Do not hand-edit; re-run the generator (the plan is the source of truth).
6652
- * Parent-scoped child of 'resources': CRUD under /V1.0/Resources/{parentId}/TimeOffApprovers —
6653
- * the global query/count stay unscoped (narrow with the 'resourceID' filter).
6654
- */
6655
-
6656
- /** Query params for ResourceTimeOffApproversResource (the G3 filter surface; no per-resource invention). */
6657
- type ResourceTimeOffApproversResourceQueryParams = QueryParams;
6658
- declare class ResourceTimeOffApproversResource extends BaseResource<ResourceTimeOffApprover, ResourceTimeOffApproverCreate, ResourceTimeOffApproverUpdate> {
6659
- constructor(http: HttpClient, pageSize: number);
6660
- /** Query ResourceTimeOffApprover records (global; narrow with the resourceID filter). */
6661
- query(params?: ResourceTimeOffApproversResourceQueryParams): AsyncIterable<ResourceTimeOffApprover>;
6662
- /** Get every ResourceTimeOffApprover record (the MCP-preferred read; 1000-page guarded). */
6663
- queryAll(params?: ResourceTimeOffApproversResourceQueryParams): Promise<ResourceTimeOffApprover[]>;
6664
- /** Count matching records (queryCount envelope unwrapped to a plain number). */
6665
- count(params?: ResourceTimeOffApproversResourceQueryParams): Promise<number>;
6666
- /** Get one record by parent + id (/V1.0/Resources/{parentId}/TimeOffApprovers/{id} — vendor item envelope; item: null → NotFoundError). */
6667
- get(parentId: Identifier, id: Identifier, opts?: {
6668
- fresh?: boolean;
6669
- } | null): Promise<ResourceTimeOffApprover>;
6670
- /** Resolve a ResourceTimeOffApprover from a numeric id (or, where the vendor indexes a primary text field,
6671
- * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
6672
- * a bare value rejects with a config error (ids only);
6673
- * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
6674
- * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
6675
- * The compact shape is the structural alias of the full record; `expand: true` is the
6676
- * type-level escape hatch. */
6677
- resolve(identifier: number | string, opts?: {
6678
- expand?: boolean;
6679
- }): Promise<ResourceTimeOffApproverSummary | null>;
6627
+ interface TicketSlaHealth {
6628
+ ticketId: Identifier;
6629
+ /** SLA result rows found for the ticket. */
6630
+ slaCount: number;
6631
+ /** `true` when every milestone of every SLA is met (a ticket with no SLAs is healthy). */
6632
+ healthy: boolean;
6633
+ /** True when a full page of SLA rows came back (more may exist; `healthy` is a lower bound). */
6634
+ truncated: boolean;
6635
+ slas: Array<{
6636
+ id: number;
6637
+ name: string | null;
6638
+ milestones: Array<{
6639
+ name: 'firstResponse' | 'resolution' | 'resolutionPlan';
6640
+ met: boolean | null;
6641
+ elapsedHours: number | null;
6642
+ }>;
6643
+ }>;
6680
6644
  }
6681
-
6682
- /**
6683
- * ResourceTimeOffBalancesResource — ResourceTimeOffBalance resource (G5 batch B, plan key 'resource_time_off_balances').
6684
- * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
6685
- * Do not hand-edit; re-run the generator (the plan is the source of truth).
6686
- * Parent-scoped child of 'resources': CRUD under /V1.0/Resources/{parentId}/TimeOffBalances —
6687
- * the global query/count stay unscoped (narrow with the 'resourceID' filter).
6688
- */
6689
-
6690
- /** Query params for ResourceTimeOffBalancesResource (the G3 filter surface; no per-resource invention). */
6691
- type ResourceTimeOffBalancesResourceQueryParams = QueryParams;
6692
- declare class ResourceTimeOffBalancesResource extends BaseResource<ResourceTimeOffBalance, ResourceTimeOffBalanceCreate, ResourceTimeOffBalanceUpdate> {
6693
- constructor(http: HttpClient, pageSize: number);
6694
- /** Get one record by parent + id (/V1.0/Resources/{parentId}/TimeOffBalances/{id} — vendor item envelope; item: null → NotFoundError). */
6695
- get(parentId: Identifier, id: Identifier, opts?: {
6696
- fresh?: boolean;
6697
- } | null): Promise<ResourceTimeOffBalance>;
6698
- /** Resolve a ResourceTimeOffBalance from a numeric id (or, where the vendor indexes a primary text field,
6699
- * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
6700
- * a bare value rejects with a config error (ids only);
6701
- * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
6702
- * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
6703
- * The compact shape is the structural alias of the full record; `expand: true` is the
6704
- * type-level escape hatch. */
6705
- resolve(identifier: number | string, opts?: {
6706
- expand?: boolean;
6707
- }): Promise<ResourceTimeOffBalanceSummary | null>;
6708
- /** Node-parity special op (hand-written in src/resources/special/resource_time_off_balances.ts). */
6709
- getByResource(resourceId: Identifier): Promise<ResourceTimeOffBalance[]>;
6710
- /** Node-parity special op (hand-written in src/resources/special/resource_time_off_balances.ts). */
6711
- getByYear(resourceId: Identifier, year: number): Promise<ResourceTimeOffBalance>;
6645
+ interface TicketSummaryResult {
6646
+ ticketId: Identifier;
6647
+ ticketNumber: string | null;
6648
+ title: string | null;
6649
+ /** `description` truncated to `summaryTextLimit` (default 500 chars, '…' suffix). */
6650
+ description: string;
6651
+ /** Length of the ORIGINAL description. */
6652
+ descriptionLength: number;
6653
+ descriptionTruncated: boolean;
6654
+ status: number | null;
6655
+ priority: number | null;
6656
+ companyID: number | null;
6657
+ contactID: number | null;
6658
+ assignedResourceID: number | null;
6659
+ projectID: number | null;
6660
+ createDate: string | null;
6661
+ dueDateTime: string | null;
6662
+ /** floor((now - createDate) / day) — null when createDate is absent. */
6663
+ ageDays: number | null;
6664
+ }
6665
+ interface TicketTimelineEvent {
6666
+ kind: 'note' | 'timeEntry' | 'history';
6667
+ id: number;
6668
+ date: string | null;
6669
+ /** `description`/`detail` truncated to `textLimit` (default 500 chars). */
6670
+ text: string | null;
6671
+ /** Notes only. */
6672
+ title: string | null;
6673
+ /** Time entries only. */
6674
+ hours: number | null;
6675
+ /** Histories only. */
6676
+ action: string | null;
6677
+ /** True when `text` was cut at `textLimit` (the full text is on the source record). */
6678
+ textTruncated: boolean;
6679
+ }
6680
+ interface TicketTimeline {
6681
+ ticketId: Identifier;
6682
+ count: number;
6683
+ /** Ascending by date (null dates last), bounded by `limit` (default 100, max 500). */
6684
+ events: TicketTimelineEvent[];
6685
+ /**
6686
+ * True when events were left out: a source returned `limit` rows (the
6687
+ * vendor query has no sort, so more may exist) or the merged list was cut
6688
+ * to `limit`. Narrow `since`/`until` to page through the rest.
6689
+ */
6690
+ truncated: boolean;
6691
+ /** Which sources (`notes`, `timeEntries`, `histories`) returned a full page. */
6692
+ cappedSources: string[];
6693
+ /**
6694
+ * Present only when at least one source deviated from the default global
6695
+ * `/query` route (issue #35): per-source route status — 'ok' (the global
6696
+ * route served it), 'ok-scoped' (the plan-declared scoped route served it
6697
+ * because the global route 404/500'd in this zone), 'miss' (every declared
6698
+ * route failed; the source contributed no events). Absent in the working
6699
+ * zone (the shape is unchanged).
6700
+ */
6701
+ sourceRoutes?: {
6702
+ notes: 'ok' | 'ok-scoped' | 'miss';
6703
+ timeEntries: 'ok' | 'ok-scoped' | 'miss';
6704
+ histories?: 'ok' | 'ok-scoped' | 'miss';
6705
+ };
6712
6706
  }
6713
6707
 
6714
6708
  /**
6715
- * RolesResource — Role resource (G5 batch B, plan key 'roles').
6709
+ * TicketsResource — Ticket resource (G4 batch A, plan key 'tickets').
6716
6710
  * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
6717
6711
  * Do not hand-edit; re-run the generator (the plan is the source of truth).
6718
6712
  */
6719
6713
 
6720
- /** Query params for RolesResource (the G3 filter surface; no per-resource invention). */
6721
- type RolesResourceQueryParams = QueryParams;
6722
- declare class RolesResource extends BaseResource<Role, RoleCreate, RoleUpdate> {
6714
+ /** Query params for TicketsResource (the G3 filter surface; no per-resource invention). */
6715
+ type TicketsResourceQueryParams = QueryParams;
6716
+ declare class TicketsResource extends BaseResource<Ticket, TicketCreate, TicketUpdate> {
6723
6717
  constructor(http: HttpClient, pageSize: number);
6724
- /** Query Role records with the G3 filter surface (server-side JSON filter). */
6725
- query(params?: RolesResourceQueryParams): AsyncIterable<Role>;
6726
- /** Get every Role record (the MCP-preferred read; 1000-page guarded). */
6727
- queryAll(params?: RolesResourceQueryParams): Promise<Role[]>;
6718
+ /** Query Ticket records with the G3 filter surface (server-side JSON filter). */
6719
+ query(params?: TicketsResourceQueryParams): AsyncIterable<Ticket>;
6720
+ /** Get every Ticket record (the MCP-preferred read; 1000-page guarded). */
6721
+ queryAll(params?: TicketsResourceQueryParams): Promise<Ticket[]>;
6728
6722
  /** Count matching records (queryCount envelope unwrapped to a plain number). */
6729
- count(params?: RolesResourceQueryParams): Promise<number>;
6723
+ count(params?: TicketsResourceQueryParams): Promise<number>;
6730
6724
  /** Get one record by id (item envelope; item: null → NotFoundError). `fresh: true` bypasses the read-cache lookup and refreshes the entry (issue #250). */
6731
6725
  get(id: Identifier, opts?: {
6732
6726
  fresh?: boolean;
6733
- } | null): Promise<Role>;
6727
+ } | null): Promise<Ticket>;
6734
6728
  /** Create a record (OperationResultModel → { id}). `dryRun: true` returns the
6735
6729
  * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
6736
6730
  * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
6737
6731
  * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
6738
- create(data: RoleCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<RoleCreate>>;
6732
+ create(data: TicketCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<TicketCreate>>;
6739
6733
  /** Update a record (PUT on the COLLECTION — the vendored spec's item path is GET-only; the vendor
6740
6734
  * keys the record by the id in the body). The vendor validates the FULL model on this route (V2), so a
6741
6735
  * partial body is merged into the CURRENT record first: one fresh GET (which also serves the
@@ -6745,43 +6739,223 @@ declare class RolesResource extends BaseResource<Role, RoleCreate, RoleUpdate> {
6745
6739
  * `dryRun: true` returns the pinned envelope whose `data` is the merged body (the exact confirmed
6746
6740
  * wire) with the best-effort diff, from that same single read; a caller-supplied lastModifiedDate that
6747
6741
  * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
6748
- update(id: Identifier, data: RoleUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<RoleUpdate>>;
6749
- /** Resolve a Role from a numeric id (or, where the vendor indexes a primary text field,
6750
- * from an exact match on name). A numeric id miss throws NOT_FOUND; a complete
6742
+ update(id: Identifier, data: TicketUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<TicketUpdate>>;
6743
+ /** Resolve a Ticket from a numeric id (or, where the vendor indexes a primary text field,
6744
+ * from an exact match on title). A numeric id miss throws NOT_FOUND; a complete
6751
6745
  * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
6752
6746
  * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
6753
6747
  * The compact shape is the structural alias of the full record; `expand: true` is the
6754
6748
  * type-level escape hatch. */
6755
6749
  resolve(identifier: number | string, opts?: {
6756
6750
  expand?: boolean;
6757
- }): Promise<RoleSummary | null>;
6758
- /** Search Role records: bounded contains on name (no vendor free-text search exists);
6759
- * limit defaults to 25, max 500. */
6751
+ }): Promise<TicketSummary | null>;
6752
+ /** findByTicketNumber — exact 'ticketNumber' filter; ambiguity throws RESOLUTION_AMBIGUOUS with the candidate ids. */
6753
+ findByTicketNumber(value: string): Promise<TicketSummary | null>;
6754
+ /** Search Ticket records: bounded contains on title (no vendor free-text search exists);
6755
+ * limit defaults to 25, max 500. Optional companyID scopes the search to one company's tickets (and-joined
6756
+ * with the title match, server-side); includeFields projects the returned columns (id is always returned). */
6760
6757
  search(query: string, opts?: {
6761
6758
  limit?: number;
6762
- }): Promise<RoleSummary[]>;
6759
+ companyID?: Identifier;
6760
+ includeFields?: string[];
6761
+ }): Promise<TicketSummary[]>;
6762
+ /** Get the Ticket with its primary context records in one call (each part a single-record
6763
+ * fetch; no sub-lists; absent/dangling references come back null). */
6764
+ getContext(id: Identifier): Promise<TicketContext>;
6765
+ /** Node-parity special op (hand-written in src/resources/special/tickets/changeStatus.ts). */
6766
+ changeStatus(id: Identifier, targetStatus: number, fields?: Record<string, unknown>, opts?: MutationOpts): Promise<TicketChangeStatusResult | TicketChangeStatusNoChange | DryRunResult<Record<string, unknown>>>;
6767
+ /** Node-parity special op (hand-written in src/resources/special/tickets/sla.ts). */
6768
+ slaHealthCheck(id: Identifier, opts?: {
6769
+ now?: Date;
6770
+ }): Promise<TicketSlaHealth>;
6771
+ /** Node-parity special op (hand-written in src/resources/special/tickets/sla.ts). */
6772
+ summary(id: Identifier, opts?: {
6773
+ summaryTextLimit?: number;
6774
+ now?: Date;
6775
+ }): Promise<TicketSummaryResult>;
6776
+ /** Node-parity special op (hand-written in src/resources/special/tickets/timeline.ts). */
6777
+ timeline(id: Identifier, opts?: {
6778
+ since?: string;
6779
+ until?: string;
6780
+ limit?: number;
6781
+ textLimit?: number;
6782
+ includeHistories?: boolean;
6783
+ }): Promise<TicketTimeline>;
6784
+ /** Node-parity special op (hand-written in src/resources/special/tickets/fullContext.ts). */
6785
+ fullContext(id: Identifier, opts?: TicketFullContextOptions): Promise<TicketFullContext>;
6786
+ /** Node-parity special op (hand-written in src/resources/special/tickets/statusSemantics.ts). */
6787
+ statusSemantics(opts?: TicketStatusOptions): Promise<TicketStatusSemantics>;
6788
+ /** Node-parity special op (hand-written in src/resources/special/tickets/forResource.ts). */
6789
+ forResource(resourceID: Identifier, opts?: TicketsForResourceListOptions): Promise<TicketsForResourceResult>;
6790
+ forResource(resourceID: Identifier, opts: TicketsForResourceCountOptions): Promise<TicketsForResourceCountResult>;
6791
+ forResource(resourceID: Identifier, opts?: TicketsForResourceOptions): Promise<TicketsForResourceResult | TicketsForResourceCountResult>;
6792
+ /** Node-parity special op (hand-written in src/resources/special/tickets/lineOfBusiness.ts). */
6793
+ lineOfBusiness(ticketId: Identifier, associationId?: Identifier): Promise<TicketLineOfBusinessResult>;
6794
+ }
6795
+
6796
+ type TicketAssignmentScope = 'primary' | 'secondary' | 'both';
6797
+ interface TicketsForResourceOptions {
6798
+ /** Which assignments to include (default 'both'). */
6799
+ scope?: TicketAssignmentScope;
6800
+ /** Keep only open tickets (default false) — the closed set is the tenant's picklist, see `closedStatus` in the result. */
6801
+ openOnly?: boolean;
6802
+ /** Explicit closed ids, overriding the resolved picklist (a caller decision, reported as source 'picklist'). */
6803
+ excludeStatusIds?: number[];
6804
+ /** Total ticket cap (1-500, default 100); `capped` is true when anything was dropped. */
6805
+ limit?: number;
6806
+ /** Extra Ticket fields on top of the pinned projection (id, ticketNumber, title, status, assignedResourceID, companyID). */
6807
+ includeFields?: string[];
6808
+ /** `false` (default true, unchanged): throw `STATUS_SEMANTICS_UNRESOLVED` instead of falling back to the assumed closed id 5 when the tenant picklist cannot be resolved (issue #244). */
6809
+ allowAssumed?: boolean;
6810
+ /** `true` (issue #248): return only the OPEN-ticket counts (`TicketsForResourceCountResult`, no ticket rows). `openOnly` and `limit` do not apply (`limit` is not validated): the open filter is always on and no rows are returned. The secondary link read follows next-page links (ids only) up to 20 pages, so `capped` is true only past 10,000 links. */
6811
+ countOnly?: boolean;
6812
+ }
6813
+ /** Options that select the rows result (`countOnly` absent or false). */
6814
+ type TicketsForResourceListOptions = Omit<TicketsForResourceOptions, 'countOnly'> & {
6815
+ countOnly?: false;
6816
+ };
6817
+ /** Options that select the count-only result. */
6818
+ type TicketsForResourceCountOptions = Omit<TicketsForResourceOptions, 'countOnly'> & {
6819
+ countOnly: true;
6820
+ };
6821
+ /**
6822
+ * The count-only result (issue #248). All figures count OPEN tickets (the same
6823
+ * filter as `tickets.count` with `status` not in the closed set): `primary`
6824
+ * equals `tickets.count({ filter: [assignedResourceID eq R, open leaf] })`,
6825
+ * `secondary` is the de-duplicated open secondary ticket ids, `both` their
6826
+ * overlap, `open` the union (primary + secondary - both).
6827
+ */
6828
+ interface TicketsForResourceCountResult {
6829
+ resourceID: number;
6830
+ scope: TicketAssignmentScope;
6831
+ primary: number;
6832
+ secondary: number;
6833
+ both: number;
6834
+ open: number;
6835
+ /** True only when the secondary link read had more pages than it read, so `secondary`/`both`/`open` may undercount. */
6836
+ capped: boolean;
6837
+ closedStatus: TicketStatusDisclosure;
6838
+ }
6839
+ interface TicketsForResourceResult {
6840
+ resourceID: number;
6841
+ scope: TicketAssignmentScope;
6842
+ openOnly: boolean;
6843
+ /** The union, de-duplicated by id, ascending. */
6844
+ tickets: Ticket[];
6845
+ /** Ids returned for the primary read. */
6846
+ primaryIds: number[];
6847
+ /** Ticket ids the secondary link rows point at (and the ticket read returned). */
6848
+ secondaryIds: number[];
6849
+ /** The de-duplicated intersection: primary AND secondary. */
6850
+ bothIds: number[];
6851
+ /** `open` counts the OPEN tickets among those returned (a closed ticket rides the set when openOnly is false); `primary`/`secondary`/`both` count ids in the union. All four describe the returned, possibly capped, set. */
6852
+ counts: {
6853
+ primary: number;
6854
+ secondary: number;
6855
+ both: number;
6856
+ open: number;
6857
+ };
6858
+ /** True when a link page, the primary page or the total cap cut the answer. */
6859
+ capped: boolean;
6860
+ /** Ticket ids the link rows named that the ticket read did not return (deleted or invisible to this API user). */
6861
+ unresolvedIds: number[];
6862
+ /** The closed set this call filtered on, and its provenance (issue #226 disclosure). */
6863
+ closedStatus: TicketStatusDisclosure;
6763
6864
  }
6764
6865
 
6866
+ /** Options for `workload` (all optional; the pinned defaults). */
6867
+ interface ResourceWorkloadOptions {
6868
+ /** Max open-ticket records in the rows part (default 50, 1-2500 — the server's `ticket_limit` bound; the join itself is additionally capped at 500 by `tickets.forResource`). */
6869
+ ticketLimit?: number;
6870
+ /** Max assignment / task-detail records (default 50, 1-2500 — the server's `task_limit` bound). */
6871
+ taskLimit?: number;
6872
+ /** Max time-off-request records (default 50, 1-2500 — the server's `time_off_limit` bound). */
6873
+ timeOffLimit?: number;
6874
+ }
6875
+ /** The exact open totals beside the rows (the countOnly read's figures). */
6876
+ interface WorkloadOpenTotals {
6877
+ primary: unknown;
6878
+ secondary: unknown;
6879
+ both: unknown;
6880
+ open: unknown;
6881
+ capped: unknown;
6882
+ }
6883
+ /** The open-tickets part value: the forResource rows + the exact totals beside them (or the typed reason the count read failed). */
6884
+ type WorkloadOpenTicketsValue = TicketsForResourceResult & {
6885
+ /** The exact open totals from the countOnly read (no row cap). */
6886
+ totals?: WorkloadOpenTotals;
6887
+ /** Present only when the countOnly read degraded: the part's typed code (the rows stand, the totals do not). */
6888
+ totalsAbsent?: string;
6889
+ };
6765
6890
  /**
6766
- * SalesOrdersResource — SalesOrder resource (G5 batch B, plan key 'sales_orders').
6891
+ * The resource's workload in ONE call (issue #313): the composite the MCP
6892
+ * server served as `autotask_resource_workload` — open tickets, assignments,
6893
+ * balances, time off.
6894
+ *
6895
+ * The resource is the ROOT (a missing resource fails the call with the typed
6896
+ * NOT_FOUND); the five PARTS are bounded reads through the registry seam
6897
+ * (then the task-details join), degrading independently to `{ value: null, absent:
6898
+ * <code> }`.
6899
+ *
6900
+ * - `open_tickets`: the SDK's `tickets.forResource` rows (primary OR
6901
+ * secondary assignments, de-duplicated, open-only on the tenant's closed
6902
+ * set, the join capped at 500) MERGED with a second `tickets.forResource`
6903
+ * countOnly read for the exact totals `{ primary, secondary, both, open,
6904
+ * capped }` beside the rows (`counts` on the rows describe only the
6905
+ * returned, possibly capped, set). A failed count read says why
6906
+ * (`totalsAbsent: <code>`) instead of vanishing. `allowAssumed: false` on
6907
+ * both reads: the answer never rests on a guessed closed id; the part
6908
+ * degrades instead.
6909
+ * - `task_assignments`: `service_call_task_resources.query { resourceID eq }`.
6910
+ * - `task_details`: the tasks behind the assignments — joined through the
6911
+ * assignment task ids (`taskID in`, bounded by IN_FILTER_CAP); no
6912
+ * assignments (or the assignments part degraded) -> `absent: 'NO_ASSIGNMENTS'`.
6913
+ * - `time_off_balances`: `resource_time_off_balances.getByResource [id]`.
6914
+ * - `time_off_requests`: `time_off_requests.query { resourceID eq }`.
6915
+ *
6916
+ * The result is the served pre-marking shape `{ root, parts }`: the server
6917
+ * keeps its per-part untrusted marking on top, so the tool output is
6918
+ * field-for-field the composite the server served today. Wire: 1 root read +
6919
+ * 5 parts (incl. the two forResource reads), then 0-1 (the task-details join).
6920
+ */
6921
+ interface ResourceWorkload {
6922
+ /** The resource record (the root read). */
6923
+ root: Resource;
6924
+ parts: {
6925
+ /** The open tickets (the forResource rows + the exact `totals` beside them, or `totalsAbsent` when the count read degraded), or the typed absent degradation. */
6926
+ open_tickets: CompositePartValue<WorkloadOpenTicketsValue>;
6927
+ /** The resource's task assignments (the bounded `service_call_task_resources.query` result envelope), or the typed absent degradation. */
6928
+ task_assignments: CompositePartValue<BoundedQueryResult<ServiceCallTaskResource>>;
6929
+ /** The tasks behind the assignments (the bounded `service_call_tasks.query` result envelope), or the typed absent degradation (`NO_ASSIGNMENTS` when there are no assignment task ids). */
6930
+ task_details: CompositePartValue<BoundedQueryResult<ServiceCallTask>>;
6931
+ /** The time-off balances (the `resource_time_off_balances.getByResource` record list), or the typed absent degradation. */
6932
+ time_off_balances: CompositePartValue<ResourceTimeOffBalance[]>;
6933
+ /** The time-off requests (the bounded `time_off_requests.query` result envelope), or the typed absent degradation. */
6934
+ time_off_requests: CompositePartValue<BoundedQueryResult<TimeOffRequest>>;
6935
+ };
6936
+ }
6937
+
6938
+ /**
6939
+ * ResourcesResource — Resource resource (G5 batch B, plan key 'resources').
6767
6940
  * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
6768
6941
  * Do not hand-edit; re-run the generator (the plan is the source of truth).
6769
6942
  */
6770
6943
 
6771
- /** Query params for SalesOrdersResource (the G3 filter surface; no per-resource invention). */
6772
- type SalesOrdersResourceQueryParams = QueryParams;
6773
- declare class SalesOrdersResource extends BaseResource<SalesOrder, SalesOrderCreate, SalesOrderUpdate> {
6774
- constructor(http: HttpClient, pageSize: number);
6775
- /** Query SalesOrder records with the G3 filter surface (server-side JSON filter). */
6776
- query(params?: SalesOrdersResourceQueryParams): AsyncIterable<SalesOrder>;
6777
- /** Get every SalesOrder record (the MCP-preferred read; 1000-page guarded). */
6778
- queryAll(params?: SalesOrdersResourceQueryParams): Promise<SalesOrder[]>;
6944
+ /** Query params for ResourcesResource (the G3 filter surface; no per-resource invention). */
6945
+ type ResourcesResourceQueryParams = QueryParams;
6946
+ declare class ResourcesResource extends BaseResource<Resource, ResourceCreate, ResourceUpdate> {
6947
+ private readonly clientConfig;
6948
+ constructor(http: HttpClient, clientConfig: ResolvedAutotaskConfig, pageSize: number);
6949
+ /** Query Resource records with the G3 filter surface (server-side JSON filter). */
6950
+ query(params?: ResourcesResourceQueryParams): AsyncIterable<Resource>;
6951
+ /** Get every Resource record (the MCP-preferred read; 1000-page guarded). */
6952
+ queryAll(params?: ResourcesResourceQueryParams): Promise<Resource[]>;
6779
6953
  /** Count matching records (queryCount envelope unwrapped to a plain number). */
6780
- count(params?: SalesOrdersResourceQueryParams): Promise<number>;
6954
+ count(params?: ResourcesResourceQueryParams): Promise<number>;
6781
6955
  /** Get one record by id (item envelope; item: null → NotFoundError). `fresh: true` bypasses the read-cache lookup and refreshes the entry (issue #250). */
6782
6956
  get(id: Identifier, opts?: {
6783
6957
  fresh?: boolean;
6784
- } | null): Promise<SalesOrder>;
6958
+ } | null): Promise<Resource>;
6785
6959
  /** Update a record (PUT on the COLLECTION — the vendored spec's item path is GET-only; the vendor
6786
6960
  * keys the record by the id in the body). The vendor validates the FULL model on this route (V2), so a
6787
6961
  * partial body is merged into the CURRENT record first: one fresh GET (which also serves the
@@ -6791,48 +6965,45 @@ declare class SalesOrdersResource extends BaseResource<SalesOrder, SalesOrderCre
6791
6965
  * `dryRun: true` returns the pinned envelope whose `data` is the merged body (the exact confirmed
6792
6966
  * wire) with the best-effort diff, from that same single read; a caller-supplied lastModifiedDate that
6793
6967
  * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
6794
- update(id: Identifier, data: SalesOrderUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<SalesOrderUpdate>>;
6968
+ update(id: Identifier, data: ResourceUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<ResourceUpdate>>;
6969
+ /** Resolve a Resource from a numeric id (or, where the vendor indexes a primary text field,
6970
+ * from an exact match on firstName / lastName). A numeric id miss throws NOT_FOUND; a complete
6971
+ * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
6972
+ * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
6973
+ * The compact shape is the structural alias of the full record; `expand: true` is the
6974
+ * type-level escape hatch. */
6975
+ resolve(identifier: number | string, opts?: {
6976
+ expand?: boolean;
6977
+ }): Promise<ResourceSummary | null>;
6978
+ /** Search Resource records: bounded contains on firstName + lastName (no vendor free-text search exists);
6979
+ * limit defaults to 25, max 500. */
6980
+ search(query: string, opts?: {
6981
+ limit?: number;
6982
+ }): Promise<ResourceSummary[]>;
6983
+ /** Node-parity special op (hand-written in src/resources/special/resources.ts). */
6984
+ whoAmI(): Promise<ResourceSummary | null>;
6985
+ /** Node-parity special op (hand-written in src/resources/special/resources.ts). */
6986
+ workload(id: Identifier, opts?: ResourceWorkloadOptions): Promise<ResourceWorkload>;
6795
6987
  }
6796
6988
 
6797
6989
  /**
6798
- * ServiceCallsResource — ServiceCall resource (G5 batch B, plan key 'service_calls').
6990
+ * ResourceTimeOffAdditionalResource — ResourceTimeOffAdditional resource (G5 batch B, plan key 'resource_time_off_additional').
6799
6991
  * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
6800
6992
  * Do not hand-edit; re-run the generator (the plan is the source of truth).
6993
+ * Parent-scoped child of 'resources': CRUD under /V1.0/Resources/{parentId}/TimeOffAdditional —
6994
+ * the global query/count stay unscoped (narrow with the 'resourceID' filter).
6801
6995
  */
6802
6996
 
6803
- /** Query params for ServiceCallsResource (the G3 filter surface; no per-resource invention). */
6804
- type ServiceCallsResourceQueryParams = QueryParams;
6805
- declare class ServiceCallsResource extends BaseResource<ServiceCall, ServiceCallCreate, ServiceCallUpdate> {
6997
+ /** Query params for ResourceTimeOffAdditionalResource (the G3 filter surface; no per-resource invention). */
6998
+ type ResourceTimeOffAdditionalResourceQueryParams = QueryParams;
6999
+ declare class ResourceTimeOffAdditionalResource extends BaseResource<ResourceTimeOffAdditional, ResourceTimeOffAdditionalCreate, ResourceTimeOffAdditionalUpdate> {
6806
7000
  constructor(http: HttpClient, pageSize: number);
6807
- /** Query ServiceCall records with the G3 filter surface (server-side JSON filter). */
6808
- query(params?: ServiceCallsResourceQueryParams): AsyncIterable<ServiceCall>;
6809
- /** Get every ServiceCall record (the MCP-preferred read; 1000-page guarded). */
6810
- queryAll(params?: ServiceCallsResourceQueryParams): Promise<ServiceCall[]>;
6811
- /** Count matching records (queryCount envelope unwrapped to a plain number). */
6812
- count(params?: ServiceCallsResourceQueryParams): Promise<number>;
6813
- /** Get one record by id (item envelope; item: null → NotFoundError). `fresh: true` bypasses the read-cache lookup and refreshes the entry (issue #250). */
6814
- get(id: Identifier, opts?: {
6815
- fresh?: boolean;
6816
- } | null): Promise<ServiceCall>;
6817
- /** Create a record (OperationResultModel → { id}). `dryRun: true` returns the
6818
- * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
6819
- * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
6820
- * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
6821
- create(data: ServiceCallCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<ServiceCallCreate>>;
6822
- /** Update a record (PUT on the COLLECTION — the vendored spec's item path is GET-only; the vendor
6823
- * keys the record by the id in the body). The vendor validates the FULL model on this route (V2), so a
6824
- * partial body is merged into the CURRENT record first: one fresh GET (which also serves the
6825
- * stale-object guard's read) then the collection PUT of the merged model — an explicit null in the
6826
- * caller body sends null; an omitted field keeps the current value. `raw: true` in the opts bag sends
6827
- * the body as-is (full model or intentional partial — the compatibility escape hatch; no merge read).
6828
- * `dryRun: true` returns the pinned envelope whose `data` is the merged body (the exact confirmed
6829
- * wire) with the best-effort diff, from that same single read; a caller-supplied lastModifiedDate that
7001
+ /** Update a record under the parent (PATCH on the collection — swagger documents put+patch there;
7002
+ * the vendor keys the record by the id in the body; OperationResultModel → { id}). `dryRun: true` returns
7003
+ * the pinned envelope with the best-effort diff; a caller-supplied lastModifiedDate that
6830
7004
  * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
6831
- update(id: Identifier, data: ServiceCallUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<ServiceCallUpdate>>;
6832
- /** Delete a record (OperationResultModel → { id}). `dryRun: true` returns the pinned
6833
- * envelope and never issues the delete. */
6834
- delete(id: Identifier, opts?: MutationOpts): Promise<OperationResult | DryRunResult<Record<string, unknown>>>;
6835
- /** Resolve a ServiceCall from a numeric id (or, where the vendor indexes a primary text field,
7005
+ update(parentId: Identifier, id: Identifier, data: ResourceTimeOffAdditionalUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<ResourceTimeOffAdditionalUpdate>>;
7006
+ /** Resolve a ResourceTimeOffAdditional from a numeric id (or, where the vendor indexes a primary text field,
6836
7007
  * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
6837
7008
  * a bare value rejects with a config error (ids only);
6838
7009
  * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
@@ -6841,40 +7012,34 @@ declare class ServiceCallsResource extends BaseResource<ServiceCall, ServiceCall
6841
7012
  * type-level escape hatch. */
6842
7013
  resolve(identifier: number | string, opts?: {
6843
7014
  expand?: boolean;
6844
- }): Promise<ServiceCallSummary | null>;
7015
+ }): Promise<ResourceTimeOffAdditionalSummary | null>;
7016
+ /** Node-parity special op (hand-written in src/resources/special/resource_time_off_additional.ts). */
7017
+ getByResource(resourceId: Identifier): Promise<ResourceTimeOffAdditional[]>;
6845
7018
  }
6846
7019
 
6847
7020
  /**
6848
- * ServiceCallTaskResourcesResource — ServiceCallTaskResource resource (G5 batch B, plan key 'service_call_task_resources').
7021
+ * ResourceTimeOffApproversResource — ResourceTimeOffApprover resource (G5 batch B, plan key 'resource_time_off_approvers').
6849
7022
  * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
6850
7023
  * Do not hand-edit; re-run the generator (the plan is the source of truth).
6851
- * Parent-scoped child of 'service_call_tasks': CRUD under /V1.0/ServiceCallTasks/{parentId}/Resources —
6852
- * the global query/count stay unscoped (narrow with the 'serviceCallTaskID' filter).
7024
+ * Parent-scoped child of 'resources': CRUD under /V1.0/Resources/{parentId}/TimeOffApprovers —
7025
+ * the global query/count stay unscoped (narrow with the 'resourceID' filter).
6853
7026
  */
6854
7027
 
6855
- /** Query params for ServiceCallTaskResourcesResource (the G3 filter surface; no per-resource invention). */
6856
- type ServiceCallTaskResourcesResourceQueryParams = QueryParams;
6857
- declare class ServiceCallTaskResourcesResource extends BaseResource<ServiceCallTaskResource, ServiceCallTaskResourceCreate, ServiceCallTaskResourceUpdate> {
7028
+ /** Query params for ResourceTimeOffApproversResource (the G3 filter surface; no per-resource invention). */
7029
+ type ResourceTimeOffApproversResourceQueryParams = QueryParams;
7030
+ declare class ResourceTimeOffApproversResource extends BaseResource<ResourceTimeOffApprover, ResourceTimeOffApproverCreate, ResourceTimeOffApproverUpdate> {
6858
7031
  constructor(http: HttpClient, pageSize: number);
6859
- /** Query ServiceCallTaskResource records (global; narrow with the serviceCallTaskID filter). */
6860
- query(params?: ServiceCallTaskResourcesResourceQueryParams): AsyncIterable<ServiceCallTaskResource>;
6861
- /** Get every ServiceCallTaskResource record (the MCP-preferred read; 1000-page guarded). */
6862
- queryAll(params?: ServiceCallTaskResourcesResourceQueryParams): Promise<ServiceCallTaskResource[]>;
7032
+ /** Query ResourceTimeOffApprover records (global; narrow with the resourceID filter). */
7033
+ query(params?: ResourceTimeOffApproversResourceQueryParams): AsyncIterable<ResourceTimeOffApprover>;
7034
+ /** Get every ResourceTimeOffApprover record (the MCP-preferred read; 1000-page guarded). */
7035
+ queryAll(params?: ResourceTimeOffApproversResourceQueryParams): Promise<ResourceTimeOffApprover[]>;
6863
7036
  /** Count matching records (queryCount envelope unwrapped to a plain number). */
6864
- count(params?: ServiceCallTaskResourcesResourceQueryParams): Promise<number>;
6865
- /** Get one record by parent + id (/V1.0/ServiceCallTasks/{parentId}/Resources/{id} — vendor item envelope; item: null → NotFoundError). */
7037
+ count(params?: ResourceTimeOffApproversResourceQueryParams): Promise<number>;
7038
+ /** Get one record by parent + id (/V1.0/Resources/{parentId}/TimeOffApprovers/{id} — vendor item envelope; item: null → NotFoundError). */
6866
7039
  get(parentId: Identifier, id: Identifier, opts?: {
6867
7040
  fresh?: boolean;
6868
- } | null): Promise<ServiceCallTaskResource>;
6869
- /** Create a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the
6870
- * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
6871
- * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
6872
- * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
6873
- create(parentId: Identifier, data: ServiceCallTaskResourceCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<ServiceCallTaskResourceCreate>>;
6874
- /** Delete a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the pinned
6875
- * envelope and never issues the delete. */
6876
- delete(parentId: Identifier, id: Identifier, opts?: MutationOpts): Promise<OperationResult | DryRunResult<Record<string, unknown>>>;
6877
- /** Resolve a ServiceCallTaskResource from a numeric id (or, where the vendor indexes a primary text field,
7041
+ } | null): Promise<ResourceTimeOffApprover>;
7042
+ /** Resolve a ResourceTimeOffApprover from a numeric id (or, where the vendor indexes a primary text field,
6878
7043
  * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
6879
7044
  * a bare value rejects with a config error (ids only);
6880
7045
  * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
@@ -6883,16 +7048,264 @@ declare class ServiceCallTaskResourcesResource extends BaseResource<ServiceCallT
6883
7048
  * type-level escape hatch. */
6884
7049
  resolve(identifier: number | string, opts?: {
6885
7050
  expand?: boolean;
6886
- }): Promise<ServiceCallTaskResourceSummary | null>;
7051
+ }): Promise<ResourceTimeOffApproverSummary | null>;
6887
7052
  }
6888
7053
 
6889
7054
  /**
6890
- * ServiceCallTasksResource — ServiceCallTask resource (G5 batch B, plan key 'service_call_tasks').
7055
+ * ResourceTimeOffBalancesResource — ResourceTimeOffBalance resource (G5 batch B, plan key 'resource_time_off_balances').
6891
7056
  * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
6892
7057
  * Do not hand-edit; re-run the generator (the plan is the source of truth).
6893
- * Parent-scoped child of 'service_calls': CRUD under /V1.0/ServiceCalls/{parentId}/Tasks —
6894
- * the global query/count stay unscoped (narrow with the 'serviceCallID' filter).
6895
- */
7058
+ * Parent-scoped child of 'resources': CRUD under /V1.0/Resources/{parentId}/TimeOffBalances —
7059
+ * the global query/count stay unscoped (narrow with the 'resourceID' filter).
7060
+ */
7061
+
7062
+ /** Query params for ResourceTimeOffBalancesResource (the G3 filter surface; no per-resource invention). */
7063
+ type ResourceTimeOffBalancesResourceQueryParams = QueryParams;
7064
+ declare class ResourceTimeOffBalancesResource extends BaseResource<ResourceTimeOffBalance, ResourceTimeOffBalanceCreate, ResourceTimeOffBalanceUpdate> {
7065
+ constructor(http: HttpClient, pageSize: number);
7066
+ /** Get one record by parent + id (/V1.0/Resources/{parentId}/TimeOffBalances/{id} — vendor item envelope; item: null → NotFoundError). */
7067
+ get(parentId: Identifier, id: Identifier, opts?: {
7068
+ fresh?: boolean;
7069
+ } | null): Promise<ResourceTimeOffBalance>;
7070
+ /** Resolve a ResourceTimeOffBalance from a numeric id (or, where the vendor indexes a primary text field,
7071
+ * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
7072
+ * a bare value rejects with a config error (ids only);
7073
+ * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
7074
+ * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
7075
+ * The compact shape is the structural alias of the full record; `expand: true` is the
7076
+ * type-level escape hatch. */
7077
+ resolve(identifier: number | string, opts?: {
7078
+ expand?: boolean;
7079
+ }): Promise<ResourceTimeOffBalanceSummary | null>;
7080
+ /** Node-parity special op (hand-written in src/resources/special/resource_time_off_balances.ts). */
7081
+ getByResource(resourceId: Identifier): Promise<ResourceTimeOffBalance[]>;
7082
+ /** Node-parity special op (hand-written in src/resources/special/resource_time_off_balances.ts). */
7083
+ getByYear(resourceId: Identifier, year: number): Promise<ResourceTimeOffBalance>;
7084
+ }
7085
+
7086
+ /**
7087
+ * RolesResource — Role resource (G5 batch B, plan key 'roles').
7088
+ * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
7089
+ * Do not hand-edit; re-run the generator (the plan is the source of truth).
7090
+ */
7091
+
7092
+ /** Query params for RolesResource (the G3 filter surface; no per-resource invention). */
7093
+ type RolesResourceQueryParams = QueryParams;
7094
+ declare class RolesResource extends BaseResource<Role, RoleCreate, RoleUpdate> {
7095
+ constructor(http: HttpClient, pageSize: number);
7096
+ /** Query Role records with the G3 filter surface (server-side JSON filter). */
7097
+ query(params?: RolesResourceQueryParams): AsyncIterable<Role>;
7098
+ /** Get every Role record (the MCP-preferred read; 1000-page guarded). */
7099
+ queryAll(params?: RolesResourceQueryParams): Promise<Role[]>;
7100
+ /** Count matching records (queryCount envelope unwrapped to a plain number). */
7101
+ count(params?: RolesResourceQueryParams): Promise<number>;
7102
+ /** Get one record by id (item envelope; item: null → NotFoundError). `fresh: true` bypasses the read-cache lookup and refreshes the entry (issue #250). */
7103
+ get(id: Identifier, opts?: {
7104
+ fresh?: boolean;
7105
+ } | null): Promise<Role>;
7106
+ /** Create a record (OperationResultModel → { id}). `dryRun: true` returns the
7107
+ * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
7108
+ * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
7109
+ * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
7110
+ create(data: RoleCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<RoleCreate>>;
7111
+ /** Update a record (PUT on the COLLECTION — the vendored spec's item path is GET-only; the vendor
7112
+ * keys the record by the id in the body). The vendor validates the FULL model on this route (V2), so a
7113
+ * partial body is merged into the CURRENT record first: one fresh GET (which also serves the
7114
+ * stale-object guard's read) then the collection PUT of the merged model — an explicit null in the
7115
+ * caller body sends null; an omitted field keeps the current value. `raw: true` in the opts bag sends
7116
+ * the body as-is (full model or intentional partial — the compatibility escape hatch; no merge read).
7117
+ * `dryRun: true` returns the pinned envelope whose `data` is the merged body (the exact confirmed
7118
+ * wire) with the best-effort diff, from that same single read; a caller-supplied lastModifiedDate that
7119
+ * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
7120
+ update(id: Identifier, data: RoleUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<RoleUpdate>>;
7121
+ /** Resolve a Role from a numeric id (or, where the vendor indexes a primary text field,
7122
+ * from an exact match on name). A numeric id miss throws NOT_FOUND; a complete
7123
+ * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
7124
+ * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
7125
+ * The compact shape is the structural alias of the full record; `expand: true` is the
7126
+ * type-level escape hatch. */
7127
+ resolve(identifier: number | string, opts?: {
7128
+ expand?: boolean;
7129
+ }): Promise<RoleSummary | null>;
7130
+ /** Search Role records: bounded contains on name (no vendor free-text search exists);
7131
+ * limit defaults to 25, max 500. */
7132
+ search(query: string, opts?: {
7133
+ limit?: number;
7134
+ }): Promise<RoleSummary[]>;
7135
+ }
7136
+
7137
+ /**
7138
+ * SalesOrdersResource — SalesOrder resource (G5 batch B, plan key 'sales_orders').
7139
+ * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
7140
+ * Do not hand-edit; re-run the generator (the plan is the source of truth).
7141
+ */
7142
+
7143
+ /** Query params for SalesOrdersResource (the G3 filter surface; no per-resource invention). */
7144
+ type SalesOrdersResourceQueryParams = QueryParams;
7145
+ declare class SalesOrdersResource extends BaseResource<SalesOrder, SalesOrderCreate, SalesOrderUpdate> {
7146
+ constructor(http: HttpClient, pageSize: number);
7147
+ /** Query SalesOrder records with the G3 filter surface (server-side JSON filter). */
7148
+ query(params?: SalesOrdersResourceQueryParams): AsyncIterable<SalesOrder>;
7149
+ /** Get every SalesOrder record (the MCP-preferred read; 1000-page guarded). */
7150
+ queryAll(params?: SalesOrdersResourceQueryParams): Promise<SalesOrder[]>;
7151
+ /** Count matching records (queryCount envelope unwrapped to a plain number). */
7152
+ count(params?: SalesOrdersResourceQueryParams): Promise<number>;
7153
+ /** Get one record by id (item envelope; item: null → NotFoundError). `fresh: true` bypasses the read-cache lookup and refreshes the entry (issue #250). */
7154
+ get(id: Identifier, opts?: {
7155
+ fresh?: boolean;
7156
+ } | null): Promise<SalesOrder>;
7157
+ /** Update a record (PUT on the COLLECTION — the vendored spec's item path is GET-only; the vendor
7158
+ * keys the record by the id in the body). The vendor validates the FULL model on this route (V2), so a
7159
+ * partial body is merged into the CURRENT record first: one fresh GET (which also serves the
7160
+ * stale-object guard's read) then the collection PUT of the merged model — an explicit null in the
7161
+ * caller body sends null; an omitted field keeps the current value. `raw: true` in the opts bag sends
7162
+ * the body as-is (full model or intentional partial — the compatibility escape hatch; no merge read).
7163
+ * `dryRun: true` returns the pinned envelope whose `data` is the merged body (the exact confirmed
7164
+ * wire) with the best-effort diff, from that same single read; a caller-supplied lastModifiedDate that
7165
+ * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
7166
+ update(id: Identifier, data: SalesOrderUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<SalesOrderUpdate>>;
7167
+ }
7168
+
7169
+ /** Options for `fullProfile` (all optional; the pinned defaults). */
7170
+ interface ServiceCallFullProfileOptions {
7171
+ /** Max ticket records (default 50, 1-2500 — the server's `ticket_limit` bound). */
7172
+ ticketLimit?: number;
7173
+ /** Max task records (default 50, 1-2500 — the server's `task_limit` bound); also bounds the assignments read. */
7174
+ taskLimit?: number;
7175
+ }
7176
+ /**
7177
+ * The service call with its tickets, tasks and resource assignments in ONE
7178
+ * call (issue #313): the composite the MCP server served as
7179
+ * `autotask_service_call_full_profile`. The service call is the ROOT (a
7180
+ * missing call fails the call with the typed NOT_FOUND); the three PARTS are
7181
+ * bounded reads, degrading independently to `{ value: null, absent:
7182
+ * <code> }`.
7183
+ *
7184
+ * The resource assignments join through the task ids (the assignment model
7185
+ * keys on `serviceCallTaskID` + `resourceID`, not `serviceCallID`): the
7186
+ * `in` filter is bounded by `IN_FILTER_CAP` (100 task ids); no task ids
7187
+ * (no tasks, or the tasks part degraded) -> the part degrades to
7188
+ * `absent: 'NO_TASKS'`.
7189
+ *
7190
+ * The result is the served pre-marking shape `{ root, parts }`: the server
7191
+ * keeps its per-part untrusted marking on top, so the tool output is
7192
+ * field-for-field the composite the server served today. Wire: 1 root read +
7193
+ * 2 bounded queries, then 0-1 (the assignments join).
7194
+ */
7195
+ interface ServiceCallFullProfile {
7196
+ /** The service call record (the root read). */
7197
+ root: ServiceCall;
7198
+ parts: {
7199
+ /** The call's tickets (the bounded `service_call_tickets.query` result envelope), or the typed absent degradation. */
7200
+ tickets: CompositePartValue<BoundedQueryResult<ServiceCallTicket>>;
7201
+ /** The call's tasks (the bounded `service_call_tasks.query` result envelope), or the typed absent degradation. */
7202
+ tasks: CompositePartValue<BoundedQueryResult<ServiceCallTask>>;
7203
+ /** The resource assignments behind the call's tasks (the bounded `service_call_task_resources.query` result envelope), or the typed absent degradation (`NO_TASKS` when there are no task ids). */
7204
+ resource_assignments: CompositePartValue<BoundedQueryResult<ServiceCallTaskResource>>;
7205
+ };
7206
+ }
7207
+
7208
+ /**
7209
+ * ServiceCallsResource — ServiceCall resource (G5 batch B, plan key 'service_calls').
7210
+ * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
7211
+ * Do not hand-edit; re-run the generator (the plan is the source of truth).
7212
+ */
7213
+
7214
+ /** Query params for ServiceCallsResource (the G3 filter surface; no per-resource invention). */
7215
+ type ServiceCallsResourceQueryParams = QueryParams;
7216
+ declare class ServiceCallsResource extends BaseResource<ServiceCall, ServiceCallCreate, ServiceCallUpdate> {
7217
+ constructor(http: HttpClient, pageSize: number);
7218
+ /** Query ServiceCall records with the G3 filter surface (server-side JSON filter). */
7219
+ query(params?: ServiceCallsResourceQueryParams): AsyncIterable<ServiceCall>;
7220
+ /** Get every ServiceCall record (the MCP-preferred read; 1000-page guarded). */
7221
+ queryAll(params?: ServiceCallsResourceQueryParams): Promise<ServiceCall[]>;
7222
+ /** Count matching records (queryCount envelope unwrapped to a plain number). */
7223
+ count(params?: ServiceCallsResourceQueryParams): Promise<number>;
7224
+ /** Get one record by id (item envelope; item: null → NotFoundError). `fresh: true` bypasses the read-cache lookup and refreshes the entry (issue #250). */
7225
+ get(id: Identifier, opts?: {
7226
+ fresh?: boolean;
7227
+ } | null): Promise<ServiceCall>;
7228
+ /** Create a record (OperationResultModel → { id}). `dryRun: true` returns the
7229
+ * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
7230
+ * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
7231
+ * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
7232
+ create(data: ServiceCallCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<ServiceCallCreate>>;
7233
+ /** Update a record (PUT on the COLLECTION — the vendored spec's item path is GET-only; the vendor
7234
+ * keys the record by the id in the body). The vendor validates the FULL model on this route (V2), so a
7235
+ * partial body is merged into the CURRENT record first: one fresh GET (which also serves the
7236
+ * stale-object guard's read) then the collection PUT of the merged model — an explicit null in the
7237
+ * caller body sends null; an omitted field keeps the current value. `raw: true` in the opts bag sends
7238
+ * the body as-is (full model or intentional partial — the compatibility escape hatch; no merge read).
7239
+ * `dryRun: true` returns the pinned envelope whose `data` is the merged body (the exact confirmed
7240
+ * wire) with the best-effort diff, from that same single read; a caller-supplied lastModifiedDate that
7241
+ * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
7242
+ update(id: Identifier, data: ServiceCallUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<ServiceCallUpdate>>;
7243
+ /** Delete a record (OperationResultModel → { id}). `dryRun: true` returns the pinned
7244
+ * envelope and never issues the delete. */
7245
+ delete(id: Identifier, opts?: MutationOpts): Promise<OperationResult | DryRunResult<Record<string, unknown>>>;
7246
+ /** Resolve a ServiceCall from a numeric id (or, where the vendor indexes a primary text field,
7247
+ * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
7248
+ * a bare value rejects with a config error (ids only);
7249
+ * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
7250
+ * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
7251
+ * The compact shape is the structural alias of the full record; `expand: true` is the
7252
+ * type-level escape hatch. */
7253
+ resolve(identifier: number | string, opts?: {
7254
+ expand?: boolean;
7255
+ }): Promise<ServiceCallSummary | null>;
7256
+ /** Node-parity special op (hand-written in src/resources/special/service_calls.ts). */
7257
+ fullProfile(id: Identifier, opts?: ServiceCallFullProfileOptions): Promise<ServiceCallFullProfile>;
7258
+ }
7259
+
7260
+ /**
7261
+ * ServiceCallTaskResourcesResource — ServiceCallTaskResource resource (G5 batch B, plan key 'service_call_task_resources').
7262
+ * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
7263
+ * Do not hand-edit; re-run the generator (the plan is the source of truth).
7264
+ * Parent-scoped child of 'service_call_tasks': CRUD under /V1.0/ServiceCallTasks/{parentId}/Resources —
7265
+ * the global query/count stay unscoped (narrow with the 'serviceCallTaskID' filter).
7266
+ */
7267
+
7268
+ /** Query params for ServiceCallTaskResourcesResource (the G3 filter surface; no per-resource invention). */
7269
+ type ServiceCallTaskResourcesResourceQueryParams = QueryParams;
7270
+ declare class ServiceCallTaskResourcesResource extends BaseResource<ServiceCallTaskResource, ServiceCallTaskResourceCreate, ServiceCallTaskResourceUpdate> {
7271
+ constructor(http: HttpClient, pageSize: number);
7272
+ /** Query ServiceCallTaskResource records (global; narrow with the serviceCallTaskID filter). */
7273
+ query(params?: ServiceCallTaskResourcesResourceQueryParams): AsyncIterable<ServiceCallTaskResource>;
7274
+ /** Get every ServiceCallTaskResource record (the MCP-preferred read; 1000-page guarded). */
7275
+ queryAll(params?: ServiceCallTaskResourcesResourceQueryParams): Promise<ServiceCallTaskResource[]>;
7276
+ /** Count matching records (queryCount envelope unwrapped to a plain number). */
7277
+ count(params?: ServiceCallTaskResourcesResourceQueryParams): Promise<number>;
7278
+ /** Get one record by parent + id (/V1.0/ServiceCallTasks/{parentId}/Resources/{id} — vendor item envelope; item: null → NotFoundError). */
7279
+ get(parentId: Identifier, id: Identifier, opts?: {
7280
+ fresh?: boolean;
7281
+ } | null): Promise<ServiceCallTaskResource>;
7282
+ /** Create a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the
7283
+ * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
7284
+ * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
7285
+ * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
7286
+ create(parentId: Identifier, data: ServiceCallTaskResourceCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<ServiceCallTaskResourceCreate>>;
7287
+ /** Delete a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the pinned
7288
+ * envelope and never issues the delete. */
7289
+ delete(parentId: Identifier, id: Identifier, opts?: MutationOpts): Promise<OperationResult | DryRunResult<Record<string, unknown>>>;
7290
+ /** Resolve a ServiceCallTaskResource from a numeric id (or, where the vendor indexes a primary text field,
7291
+ * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
7292
+ * a bare value rejects with a config error (ids only);
7293
+ * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
7294
+ * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
7295
+ * The compact shape is the structural alias of the full record; `expand: true` is the
7296
+ * type-level escape hatch. */
7297
+ resolve(identifier: number | string, opts?: {
7298
+ expand?: boolean;
7299
+ }): Promise<ServiceCallTaskResourceSummary | null>;
7300
+ }
7301
+
7302
+ /**
7303
+ * ServiceCallTasksResource — ServiceCallTask resource (G5 batch B, plan key 'service_call_tasks').
7304
+ * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
7305
+ * Do not hand-edit; re-run the generator (the plan is the source of truth).
7306
+ * Parent-scoped child of 'service_calls': CRUD under /V1.0/ServiceCalls/{parentId}/Tasks —
7307
+ * the global query/count stay unscoped (narrow with the 'serviceCallID' filter).
7308
+ */
6896
7309
 
6897
7310
  /** Query params for ServiceCallTasksResource (the G3 filter surface; no per-resource invention). */
6898
7311
  type ServiceCallTasksResourceQueryParams = QueryParams;
@@ -8083,536 +8496,81 @@ declare class TicketNoteAttachmentsResource extends BaseResource<TicketNoteAttac
8083
8496
  * The compact shape is the structural alias of the full record; `expand: true` is the
8084
8497
  * type-level escape hatch. */
8085
8498
  resolve(identifier: number | string, opts?: {
8086
- expand?: boolean;
8087
- }): Promise<TicketNoteAttachmentSummary | null>;
8088
- }
8089
-
8090
- /**
8091
- * TicketNotesResource — TicketNote resource (G4 batch A, plan key 'ticket_notes').
8092
- * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
8093
- * Do not hand-edit; re-run the generator (the plan is the source of truth).
8094
- * Parent-scoped child of 'tickets': CRUD under /V1.0/Tickets/{parentId}/Notes —
8095
- * the global query/count stay unscoped (narrow with the 'ticketID' filter).
8096
- */
8097
-
8098
- /** Query params for TicketNotesResource (the G3 filter surface; no per-resource invention). */
8099
- type TicketNotesResourceQueryParams = QueryParams;
8100
- declare class TicketNotesResource extends BaseResource<TicketNote, TicketNoteCreate, TicketNoteUpdate> {
8101
- constructor(http: HttpClient, pageSize: number);
8102
- /** Query TicketNote records (global; narrow with the ticketID filter). */
8103
- query(params?: TicketNotesResourceQueryParams): AsyncIterable<TicketNote>;
8104
- /** Get every TicketNote record (the MCP-preferred read; 1000-page guarded). */
8105
- queryAll(params?: TicketNotesResourceQueryParams): Promise<TicketNote[]>;
8106
- /** Count matching records (queryCount envelope unwrapped to a plain number). */
8107
- count(params?: TicketNotesResourceQueryParams): Promise<number>;
8108
- /** Get one record by parent + id (/V1.0/Tickets/{parentId}/Notes/{id} — vendor item envelope; item: null → NotFoundError). */
8109
- get(parentId: Identifier, id: Identifier, opts?: {
8110
- fresh?: boolean;
8111
- } | null): Promise<TicketNote>;
8112
- /** Create a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the
8113
- * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
8114
- * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
8115
- * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
8116
- create(parentId: Identifier, data: TicketNoteCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<TicketNoteCreate>>;
8117
- /** Update a record under the parent (PATCH on the collection — swagger documents put+patch there;
8118
- * the vendor keys the record by the id in the body; OperationResultModel → { id}). `dryRun: true` returns
8119
- * the pinned envelope with the best-effort diff; a caller-supplied lastModifiedDate that
8120
- * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
8121
- update(parentId: Identifier, id: Identifier, data: TicketNoteUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<TicketNoteUpdate>>;
8122
- /** Resolve a TicketNote from a numeric id (or, where the vendor indexes a primary text field,
8123
- * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
8124
- * a bare value rejects with a config error (ids only);
8125
- * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
8126
- * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
8127
- * The compact shape is the structural alias of the full record; `expand: true` is the
8128
- * type-level escape hatch. */
8129
- resolve(identifier: number | string, opts?: {
8130
- expand?: boolean;
8131
- }): Promise<TicketNoteSummary | null>;
8132
- }
8133
-
8134
- /**
8135
- * TicketNoteWebhooksResource — TicketNoteWebhook resource (G5 batch B, plan key 'ticket_note_webhooks').
8136
- * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
8137
- * Do not hand-edit; re-run the generator (the plan is the source of truth).
8138
- * Parent-scoped child of 'ticket_notes': CRUD under /V1.0/TicketNotes/{parentId}/Webhook —
8139
- * the global query/count stay unscoped (narrow with the 'parent' filter).
8140
- */
8141
-
8142
- /** Query params for TicketNoteWebhooksResource (the G3 filter surface; no per-resource invention). */
8143
- type TicketNoteWebhooksResourceQueryParams = QueryParams;
8144
- declare class TicketNoteWebhooksResource extends BaseResource<TicketNoteWebhook, TicketNoteWebhookCreate, TicketNoteWebhookUpdate> {
8145
- constructor(http: HttpClient, pageSize: number);
8146
- /** Query TicketNoteWebhook records (global; narrow with the parent filter). */
8147
- query(params?: TicketNoteWebhooksResourceQueryParams): AsyncIterable<TicketNoteWebhook>;
8148
- /** Get every TicketNoteWebhook record (the MCP-preferred read; 1000-page guarded). */
8149
- queryAll(params?: TicketNoteWebhooksResourceQueryParams): Promise<TicketNoteWebhook[]>;
8150
- /** Count matching records (queryCount envelope unwrapped to a plain number). */
8151
- count(params?: TicketNoteWebhooksResourceQueryParams): Promise<number>;
8152
- /** Get one record by id (item envelope; item: null → NotFoundError). `fresh: true` bypasses the read-cache lookup and refreshes the entry (issue #250). */
8153
- get(id: Identifier, opts?: {
8154
- fresh?: boolean;
8155
- } | null): Promise<TicketNoteWebhook>;
8156
- /** Create a record (OperationResultModel → { id}). `dryRun: true` returns the
8157
- * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
8158
- * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
8159
- * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
8160
- create(data: TicketNoteWebhookCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<TicketNoteWebhookCreate>>;
8161
- /** Update a record (PUT on the COLLECTION — the vendored spec's item path is GET-only; the vendor
8162
- * keys the record by the id in the body). The vendor validates the FULL model on this route (V2), so a
8163
- * partial body is merged into the CURRENT record first: one fresh GET (which also serves the
8164
- * stale-object guard's read) then the collection PUT of the merged model — an explicit null in the
8165
- * caller body sends null; an omitted field keeps the current value. `raw: true` in the opts bag sends
8166
- * the body as-is (full model or intentional partial — the compatibility escape hatch; no merge read).
8167
- * `dryRun: true` returns the pinned envelope whose `data` is the merged body (the exact confirmed
8168
- * wire) with the best-effort diff, from that same single read; a caller-supplied lastModifiedDate that
8169
- * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
8170
- update(id: Identifier, data: TicketNoteWebhookUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<TicketNoteWebhookUpdate>>;
8171
- /** Delete a record (OperationResultModel → { id}). `dryRun: true` returns the pinned
8172
- * envelope and never issues the delete. */
8173
- delete(id: Identifier, opts?: MutationOpts): Promise<OperationResult | DryRunResult<Record<string, unknown>>>;
8174
- /** Resolve a TicketNoteWebhook from a numeric id (or, where the vendor indexes a primary text field,
8175
- * from an exact match on name). A numeric id miss throws NOT_FOUND; a complete
8176
- * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
8177
- * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
8178
- * The compact shape is the structural alias of the full record; `expand: true` is the
8179
- * type-level escape hatch. */
8180
- resolve(identifier: number | string, opts?: {
8181
- expand?: boolean;
8182
- }): Promise<TicketNoteWebhookSummary | null>;
8183
- /** Search TicketNoteWebhook records: bounded contains on name (no vendor free-text search exists);
8184
- * limit defaults to 25, max 500. */
8185
- search(query: string, opts?: {
8186
- limit?: number;
8187
- }): Promise<TicketNoteWebhookSummary[]>;
8188
- }
8189
-
8190
- /**
8191
- * TicketSecondaryResourcesResource — TicketSecondaryResource resource (G4 batch A, plan key 'ticket_secondary_resources').
8192
- * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
8193
- * Do not hand-edit; re-run the generator (the plan is the source of truth).
8194
- * Parent-scoped child of 'tickets': CRUD under /V1.0/Tickets/{parentId}/SecondaryResources —
8195
- * the global query/count stay unscoped (narrow with the 'ticketID' filter).
8196
- */
8197
-
8198
- /** Query params for TicketSecondaryResourcesResource (the G3 filter surface; no per-resource invention). */
8199
- type TicketSecondaryResourcesResourceQueryParams = QueryParams;
8200
- declare class TicketSecondaryResourcesResource extends BaseResource<TicketSecondaryResource, TicketSecondaryResourceCreate, TicketSecondaryResourceUpdate> {
8201
- constructor(http: HttpClient, pageSize: number);
8202
- /** Query TicketSecondaryResource records (global; narrow with the ticketID filter). */
8203
- query(params?: TicketSecondaryResourcesResourceQueryParams): AsyncIterable<TicketSecondaryResource>;
8204
- /** Get every TicketSecondaryResource record (the MCP-preferred read; 1000-page guarded). */
8205
- queryAll(params?: TicketSecondaryResourcesResourceQueryParams): Promise<TicketSecondaryResource[]>;
8206
- /** Count matching records (queryCount envelope unwrapped to a plain number). */
8207
- count(params?: TicketSecondaryResourcesResourceQueryParams): Promise<number>;
8208
- /** Get one record by parent + id (/V1.0/Tickets/{parentId}/SecondaryResources/{id} — vendor item envelope; item: null → NotFoundError). */
8209
- get(parentId: Identifier, id: Identifier, opts?: {
8210
- fresh?: boolean;
8211
- } | null): Promise<TicketSecondaryResource>;
8212
- /** Create a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the
8213
- * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
8214
- * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
8215
- * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
8216
- create(parentId: Identifier, data: TicketSecondaryResourceCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<TicketSecondaryResourceCreate>>;
8217
- /** Delete a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the pinned
8218
- * envelope and never issues the delete. */
8219
- delete(parentId: Identifier, id: Identifier, opts?: MutationOpts): Promise<OperationResult | DryRunResult<Record<string, unknown>>>;
8220
- /** Resolve a TicketSecondaryResource from a numeric id (or, where the vendor indexes a primary text field,
8221
- * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
8222
- * a bare value rejects with a config error (ids only);
8223
- * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
8224
- * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
8225
- * The compact shape is the structural alias of the full record; `expand: true` is the
8226
- * type-level escape hatch. */
8227
- resolve(identifier: number | string, opts?: {
8228
- expand?: boolean;
8229
- }): Promise<TicketSecondaryResourceSummary | null>;
8230
- }
8231
-
8232
- /**
8233
- * One route fact on a composite child part that the default global `/query`
8234
- * route did not serve (issue #35): the route attempted, the path it
8235
- * attempted, and the HTTP status that failed it (null when the failure was
8236
- * not an HTTP status — a shape or transport fault).
8237
- */
8238
- interface TicketChildRouteFact {
8239
- /** The route that was attempted (the plan-declared scoped collection read is 'scoped'). */
8240
- route: 'global' | 'scoped';
8241
- /** The path the route attempted (e.g. '/V1.0/TicketNotes/query' or '/V1.0/Tickets/527119/Notes'). */
8242
- path: string;
8243
- /** The HTTP status that failed the route (null for a non-HTTP failure). */
8244
- httpStatus: number | null;
8245
- }
8246
-
8247
- interface TicketSlaHealth {
8248
- ticketId: Identifier;
8249
- /** SLA result rows found for the ticket. */
8250
- slaCount: number;
8251
- /** `true` when every milestone of every SLA is met (a ticket with no SLAs is healthy). */
8252
- healthy: boolean;
8253
- /** True when a full page of SLA rows came back (more may exist; `healthy` is a lower bound). */
8254
- truncated: boolean;
8255
- slas: Array<{
8256
- id: number;
8257
- name: string | null;
8258
- milestones: Array<{
8259
- name: 'firstResponse' | 'resolution' | 'resolutionPlan';
8260
- met: boolean | null;
8261
- elapsedHours: number | null;
8262
- }>;
8263
- }>;
8264
- }
8265
- interface TicketSummaryResult {
8266
- ticketId: Identifier;
8267
- ticketNumber: string | null;
8268
- title: string | null;
8269
- /** `description` truncated to `summaryTextLimit` (default 500 chars, '…' suffix). */
8270
- description: string;
8271
- /** Length of the ORIGINAL description. */
8272
- descriptionLength: number;
8273
- descriptionTruncated: boolean;
8274
- status: number | null;
8275
- priority: number | null;
8276
- companyID: number | null;
8277
- contactID: number | null;
8278
- assignedResourceID: number | null;
8279
- projectID: number | null;
8280
- createDate: string | null;
8281
- dueDateTime: string | null;
8282
- /** floor((now - createDate) / day) — null when createDate is absent. */
8283
- ageDays: number | null;
8284
- }
8285
- interface TicketTimelineEvent {
8286
- kind: 'note' | 'timeEntry' | 'history';
8287
- id: number;
8288
- date: string | null;
8289
- /** `description`/`detail` truncated to `textLimit` (default 500 chars). */
8290
- text: string | null;
8291
- /** Notes only. */
8292
- title: string | null;
8293
- /** Time entries only. */
8294
- hours: number | null;
8295
- /** Histories only. */
8296
- action: string | null;
8297
- /** True when `text` was cut at `textLimit` (the full text is on the source record). */
8298
- textTruncated: boolean;
8299
- }
8300
- interface TicketTimeline {
8301
- ticketId: Identifier;
8302
- count: number;
8303
- /** Ascending by date (null dates last), bounded by `limit` (default 100, max 500). */
8304
- events: TicketTimelineEvent[];
8305
- /**
8306
- * True when events were left out: a source returned `limit` rows (the
8307
- * vendor query has no sort, so more may exist) or the merged list was cut
8308
- * to `limit`. Narrow `since`/`until` to page through the rest.
8309
- */
8310
- truncated: boolean;
8311
- /** Which sources (`notes`, `timeEntries`, `histories`) returned a full page. */
8312
- cappedSources: string[];
8313
- /**
8314
- * Present only when at least one source deviated from the default global
8315
- * `/query` route (issue #35): per-source route status — 'ok' (the global
8316
- * route served it), 'ok-scoped' (the plan-declared scoped route served it
8317
- * because the global route 404/500'd in this zone), 'miss' (every declared
8318
- * route failed; the source contributed no events). Absent in the working
8319
- * zone (the shape is unchanged).
8320
- */
8321
- sourceRoutes?: {
8322
- notes: 'ok' | 'ok-scoped' | 'miss';
8323
- timeEntries: 'ok' | 'ok-scoped' | 'miss';
8324
- histories?: 'ok' | 'ok-scoped' | 'miss';
8325
- };
8326
- }
8327
-
8328
- interface OpenWithNoteAndAssignParams {
8329
- /** The company the ticket opens under (the vendor field companyID). */
8330
- companyID: number;
8331
- /** The ticket title (required). */
8332
- title: string;
8333
- /** Priority picklist (default 3 — the ww29-proven Low). */
8334
- priority?: number;
8335
- /** Status picklist (default 1 — New). */
8336
- status?: number;
8337
- /**
8338
- * The queue (the vendor field queueID). The node NEVER guesses a queue:
8339
- * omitted + the vendor 500 names it → the typed QUEUE_REQUIRED error
8340
- * (vendor message + suggestedAction: discover via autotask_describe(tickets.create)).
8341
- */
8342
- queueID?: number;
8343
- }
8344
- interface OpenWithNoteAndAssignNote {
8345
- /** The note text (required). */
8346
- description: string;
8347
- /**
8348
- * The note title (REQUIRED — S12-A live-verified on ww29: the vendor 500s
8349
- * the scoped note create without it — `Missing Required Field: title.`;
8350
- * the S11-B proven note body is { title, description, noteType: 1,
8351
- * publish: 1 }, ticketID supplied by the scoped path).
8352
- */
8353
- title: string;
8354
- /** The note type integer picklist (default 1). */
8355
- noteType?: number;
8356
- /** The publish integer picklist 1/2/4 (default 1 — NOT a boolean). */
8357
- publish?: number;
8358
- }
8359
- interface OpenWithNoteAndAssignAssign {
8360
- /** The resource to assign (prechecked via resources.get — RESOURCE_INVALID on missing/inactive; number, or a canonical integer string for ids above 2^53). */
8361
- resourceID: Identifier;
8362
- /**
8363
- * The resource role to assign (REQUIRED — S12-A live-verified on ww29:
8364
- * the vendor REQUIRES both ids when assigning a resource —
8365
- * `Data violation: When assigning a Resource, you must assign both a
8366
- * assignedResourceID and assignedResourceRoleID.` — a roleID without a
8367
- * resourceID (or vice versa) is a zero-wire config fault, never a
8368
- * half-assignment on the wire).
8369
- */
8370
- roleID: number;
8371
- }
8372
- /** One step of the partial-failure contract (create/note/assign). */
8373
- interface OpenStepResult {
8374
- name: 'create' | 'note' | 'assign';
8375
- ok: boolean;
8376
- /** The typed failure (code + vendor detail) when ok is false. */
8377
- error?: string;
8378
- }
8379
- interface OpenWithNoteAndAssignResult {
8380
- /** The created ticket id (always present once the create settled). */
8381
- ticketId: number;
8382
- /** The vendor ticket number (from the assign merge read when assign ran; null otherwise). */
8383
- ticketNumber: string | null;
8384
- /** The created note id (null when no note was requested or the step failed). */
8385
- noteId: number | null;
8386
- /** True when the assignment was applied (the merge PUT settled 200). */
8387
- assigned: boolean;
8388
- /** The partial-failure contract: every step's outcome (a failure never throws — it lands here). */
8389
- steps: OpenStepResult[];
8390
- /**
8391
- * Present when the assign precheck touched the resources surface (blind to
8392
- * the API user — count/query return 0; get is the authority; docs/API.md §11).
8393
- */
8394
- blind?: {
8395
- resources: true;
8396
- note: string;
8397
- };
8398
- }
8399
-
8400
- interface TicketChangeStatusResult {
8401
- ticketId: Identifier;
8402
- previousStatus: number | null;
8403
- /** The post-PUT read-back value (verified === targetStatus or the op throws). */
8404
- status: number;
8405
- changed: true;
8406
- /** The map-required fields the node filled with proven-safe defaults. */
8407
- filledFields: string[];
8408
- /** Discovery-merge count applied on PUT 500s (0 = first-try PUT). */
8409
- discoveryMerges: number;
8410
- }
8411
- interface TicketChangeStatusNoChange {
8412
- ticketId: Identifier;
8413
- changed: false;
8414
- status: number;
8415
- reason: 'NO_CHANGE';
8416
- }
8417
-
8418
- /** Options for `fullContext` (all optional; the pinned defaults). */
8419
- interface TicketFullContextOptions {
8420
- /** Max note records (default 50). */
8421
- noteLimit?: number;
8422
- /** Max time-entry records (default 50). */
8423
- timeEntryLimit?: number;
8424
- /** Include the attachments part (default true) — METADATA only (ids + names); data download stays a separate op. */
8425
- includeAttachments?: boolean;
8426
- /** Include the histories part (default false — budget control). */
8427
- includeHistories?: boolean;
8428
- /** Long note/history text is truncated to this many chars in the served copy and flagged (default 500). */
8429
- textLimit?: number;
8430
- /** Opt-in name/label siblings (issue #77; default OFF — the sibling keys are ABSENT, not null, and no name/label resolution runs: zero added wire, byte-identical output). ON: the ticket row and each time-entry row carry the closed-scope siblings (the ticket picklist labels — status / priority / ticketType / issueType / subIssueType / source / queue — plus the contract / billing-code / role record-FK names and the resource names — creator + the time-entry resource) and the top-level `names` section. */
8431
- names?: boolean;
8432
- /** May LOWER the composite's name-read budget (default 20 — the count of COLD wire reads issued for name resolution; cache hits are free of the budget). The caller may lower it, never raise it; over-budget ids serve `name: null` and the names section sets `truncated: true` (never an error). */
8433
- maxNameReads?: number;
8434
- }
8435
- /** One capped list part (a full page sets `capped: true` — more may exist). */
8436
- interface TicketFullContextPart<TItem = Record<string, unknown>> {
8437
- items: TItem[];
8438
- /** True when the part returned a full page (the vendor query has no sort — more may exist past the cap). */
8439
- capped: boolean;
8440
- /** Present only when the part was served by the plan-declared parent-scoped route (issue #35: the global /query route 404/500'd in this zone). Absent when the default global route served the part (working-zone shape unchanged). */
8441
- route?: 'scoped';
8442
- /** Present only when the part status is 'miss' (issue #35): every declared route attempted, in attempt order. The part serves no items; the call itself succeeds (a part miss never fails the op — the same rule as the FK 'absent' parts). */
8443
- routeFacts?: TicketChildRouteFact[];
8444
- }
8445
- /** The attachments part is METADATA only (data download stays a separate op). */
8446
- interface TicketFullContextAttachments {
8447
- ids: number[];
8448
- /** The attachment `title` (null when absent). */
8449
- names: Array<string | null>;
8450
- capped: boolean;
8451
- route?: 'scoped';
8452
- routeFacts?: TicketChildRouteFact[];
8453
- }
8454
- /**
8455
- * The full ticket context in ONE call (plan T3): the ticket + its context
8456
- * parts (the proven `getContext` 5-part composite — dangling FKs come back
8457
- * null and are reported in `parts`, a part miss never fails the op) + its
8458
- * notes, time entries, attachment metadata and (opt-in) histories via the
8459
- * timeline's bounded query machinery. 8 bounded reads (10 with
8460
- * `includeHistories`); zero mutating. The ticket itself missing → the
8461
- * `getContext` NotFoundError propagates.
8462
- */
8463
- interface TicketFullContext {
8464
- ticket: Ticket;
8465
- /** Null when the ticket carries no companyID (or the record misses). */
8466
- company: Company | null;
8467
- /** Null when the ticket carries no contactID (or the record misses). */
8468
- contact: Contact | null;
8469
- /** Null when the ticket carries no assignedResourceID (or the record misses). */
8470
- assignedResource: Resource | null;
8471
- /** Null when the ticket carries no projectID (or the record misses). */
8472
- project: Project | null;
8473
- notes: TicketFullContextPart;
8474
- timeEntries: TicketFullContextPart;
8475
- /** Present when `includeAttachments` is not false (default: present). */
8476
- attachments: TicketFullContextAttachments;
8477
- /** Present only when `includeHistories: true`. */
8478
- histories?: TicketFullContextPart;
8479
- /** True when ANY part hit its cap (more may exist past the cap) — or any name read hit the name-read budget (issue #77, `names: true`). */
8480
- truncated: boolean;
8481
- /** The opt-in name/label section (issue #77) — present EXACTLY when `names: true` (the sibling keys are absent from the rows otherwise). */
8482
- names?: CompositeNamesSection;
8483
- /** The Line of Business chain that applies to this ticket — present EXACTLY when `names: true`. Resolved from the ticket's own `organizationalLevelAssociationID` when set, otherwise from the ticket's CONTRACT's pointer (`source: 'contract'`, `contractId` says which; the association is maintained on contracts in practice, so this is the common path). The three hops: the OrganizationalLevelAssociation, the OrganizationalLevel2 (the customizable "Line of Business" label) and the OrganizationalLevel1 (the division). An absent pointer anywhere is reported with all-`missing` markers; a dangling record is `unresolved`; a broken chain is never an error. Costs 1 association + up to 2 level reads inside `maxNameReads`, plus one cached contract read when the fallback runs. */
8484
- lineOfBusiness?: LineOfBusinessNames;
8485
- /** Per-part status: FK parts 'ok' | 'absent' (dangling/missing FK); list parts 'ok' (served by the global /query route — a 0-row filtered query is a legitimate answer), 'ok-scoped' (issue #35: the plan-declared scoped route served the part because the global route 404/500'd in this zone — only where the plan declares a scoped route), or 'miss' (issue #35: every declared route failed; the part serves no items, recorded in the part's routeFacts). */
8486
- parts: {
8487
- company: 'ok' | 'absent';
8488
- contact: 'ok' | 'absent';
8489
- assignedResource: 'ok' | 'absent';
8490
- project: 'ok' | 'absent';
8491
- notes: 'ok' | 'ok-scoped' | 'miss';
8492
- timeEntries: 'ok' | 'ok-scoped' | 'miss';
8493
- attachments: 'ok' | 'ok-scoped' | 'miss';
8494
- histories?: 'ok' | 'ok-scoped' | 'miss';
8495
- };
8496
- }
8497
-
8498
- type TicketAssignmentScope = 'primary' | 'secondary' | 'both';
8499
- interface TicketsForResourceOptions {
8500
- /** Which assignments to include (default 'both'). */
8501
- scope?: TicketAssignmentScope;
8502
- /** Keep only open tickets (default false) — the closed set is the tenant's picklist, see `closedStatus` in the result. */
8503
- openOnly?: boolean;
8504
- /** Explicit closed ids, overriding the resolved picklist (a caller decision, reported as source 'picklist'). */
8505
- excludeStatusIds?: number[];
8506
- /** Total ticket cap (1-500, default 100); `capped` is true when anything was dropped. */
8507
- limit?: number;
8508
- /** Extra Ticket fields on top of the pinned projection (id, ticketNumber, title, status, assignedResourceID, companyID). */
8509
- includeFields?: string[];
8510
- /** `false` (default true, unchanged): throw `STATUS_SEMANTICS_UNRESOLVED` instead of falling back to the assumed closed id 5 when the tenant picklist cannot be resolved (issue #244). */
8511
- allowAssumed?: boolean;
8512
- /** `true` (issue #248): return only the OPEN-ticket counts (`TicketsForResourceCountResult`, no ticket rows). `openOnly` and `limit` do not apply (`limit` is not validated): the open filter is always on and no rows are returned. The secondary link read follows next-page links (ids only) up to 20 pages, so `capped` is true only past 10,000 links. */
8513
- countOnly?: boolean;
8514
- }
8515
- /** Options that select the rows result (`countOnly` absent or false). */
8516
- type TicketsForResourceListOptions = Omit<TicketsForResourceOptions, 'countOnly'> & {
8517
- countOnly?: false;
8518
- };
8519
- /** Options that select the count-only result. */
8520
- type TicketsForResourceCountOptions = Omit<TicketsForResourceOptions, 'countOnly'> & {
8521
- countOnly: true;
8522
- };
8523
- /**
8524
- * The count-only result (issue #248). All figures count OPEN tickets (the same
8525
- * filter as `tickets.count` with `status` not in the closed set): `primary`
8526
- * equals `tickets.count({ filter: [assignedResourceID eq R, open leaf] })`,
8527
- * `secondary` is the de-duplicated open secondary ticket ids, `both` their
8528
- * overlap, `open` the union (primary + secondary - both).
8529
- */
8530
- interface TicketsForResourceCountResult {
8531
- resourceID: number;
8532
- scope: TicketAssignmentScope;
8533
- primary: number;
8534
- secondary: number;
8535
- both: number;
8536
- open: number;
8537
- /** True only when the secondary link read had more pages than it read, so `secondary`/`both`/`open` may undercount. */
8538
- capped: boolean;
8539
- closedStatus: TicketStatusDisclosure;
8540
- }
8541
- interface TicketsForResourceResult {
8542
- resourceID: number;
8543
- scope: TicketAssignmentScope;
8544
- openOnly: boolean;
8545
- /** The union, de-duplicated by id, ascending. */
8546
- tickets: Ticket[];
8547
- /** Ids returned for the primary read. */
8548
- primaryIds: number[];
8549
- /** Ticket ids the secondary link rows point at (and the ticket read returned). */
8550
- secondaryIds: number[];
8551
- /** The de-duplicated intersection: primary AND secondary. */
8552
- bothIds: number[];
8553
- /** `open` counts the OPEN tickets among those returned (a closed ticket rides the set when openOnly is false); `primary`/`secondary`/`both` count ids in the union. All four describe the returned, possibly capped, set. */
8554
- counts: {
8555
- primary: number;
8556
- secondary: number;
8557
- both: number;
8558
- open: number;
8559
- };
8560
- /** True when a link page, the primary page or the total cap cut the answer. */
8561
- capped: boolean;
8562
- /** Ticket ids the link rows named that the ticket read did not return (deleted or invisible to this API user). */
8563
- unresolvedIds: number[];
8564
- /** The closed set this call filtered on, and its provenance (issue #226 disclosure). */
8565
- closedStatus: TicketStatusDisclosure;
8566
- }
8567
-
8568
- /** The full LOB chain for one ticket. */
8569
- interface TicketLineOfBusinessResult {
8570
- ticketId: Identifier;
8571
- /** Where the association id came from: the ticket's own pointer, its contract's, the caller's argument, or null when none was found. */
8572
- associationSource: 'ticket' | 'contract' | 'argument' | null;
8573
- /** The contract consulted for the fallback (null when the ticket pointer or the argument supplied the id). */
8574
- contractId: Identifier | null;
8575
- /** The association row when served, otherwise null. */
8576
- association: OrganizationalLevelAssociation | null;
8577
- /** The OrganizationalLevel2 row (the customizable "Line of Business" label), otherwise null. */
8578
- organizationalLevel2: OrganizationalLevel2 | null;
8579
- /** The OrganizationalLevel1 row (the division), otherwise null. */
8580
- organizationalLevel1: OrganizationalLevel1 | null;
8581
- /** Explicit per-hop markers — a broken chain is reported, never thrown.
8582
- * `capped` cannot occur on this op: its fixed budget always covers the full
8583
- * chain (1 association + up to 2 level reads). */
8584
- markers: {
8585
- association: LineOfBusinessMarker;
8586
- organizationalLevel2: LineOfBusinessMarker;
8587
- organizationalLevel1: LineOfBusinessMarker;
8588
- };
8499
+ expand?: boolean;
8500
+ }): Promise<TicketNoteAttachmentSummary | null>;
8589
8501
  }
8590
8502
 
8591
8503
  /**
8592
- * TicketsResource — Ticket resource (G4 batch A, plan key 'tickets').
8504
+ * TicketNotesResource — TicketNote resource (G4 batch A, plan key 'ticket_notes').
8593
8505
  * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
8594
8506
  * Do not hand-edit; re-run the generator (the plan is the source of truth).
8507
+ * Parent-scoped child of 'tickets': CRUD under /V1.0/Tickets/{parentId}/Notes —
8508
+ * the global query/count stay unscoped (narrow with the 'ticketID' filter).
8595
8509
  */
8596
8510
 
8597
- /** Query params for TicketsResource (the G3 filter surface; no per-resource invention). */
8598
- type TicketsResourceQueryParams = QueryParams;
8599
- declare class TicketsResource extends BaseResource<Ticket, TicketCreate, TicketUpdate> {
8511
+ /** Query params for TicketNotesResource (the G3 filter surface; no per-resource invention). */
8512
+ type TicketNotesResourceQueryParams = QueryParams;
8513
+ declare class TicketNotesResource extends BaseResource<TicketNote, TicketNoteCreate, TicketNoteUpdate> {
8600
8514
  constructor(http: HttpClient, pageSize: number);
8601
- /** Query Ticket records with the G3 filter surface (server-side JSON filter). */
8602
- query(params?: TicketsResourceQueryParams): AsyncIterable<Ticket>;
8603
- /** Get every Ticket record (the MCP-preferred read; 1000-page guarded). */
8604
- queryAll(params?: TicketsResourceQueryParams): Promise<Ticket[]>;
8515
+ /** Query TicketNote records (global; narrow with the ticketID filter). */
8516
+ query(params?: TicketNotesResourceQueryParams): AsyncIterable<TicketNote>;
8517
+ /** Get every TicketNote record (the MCP-preferred read; 1000-page guarded). */
8518
+ queryAll(params?: TicketNotesResourceQueryParams): Promise<TicketNote[]>;
8605
8519
  /** Count matching records (queryCount envelope unwrapped to a plain number). */
8606
- count(params?: TicketsResourceQueryParams): Promise<number>;
8520
+ count(params?: TicketNotesResourceQueryParams): Promise<number>;
8521
+ /** Get one record by parent + id (/V1.0/Tickets/{parentId}/Notes/{id} — vendor item envelope; item: null → NotFoundError). */
8522
+ get(parentId: Identifier, id: Identifier, opts?: {
8523
+ fresh?: boolean;
8524
+ } | null): Promise<TicketNote>;
8525
+ /** Create a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the
8526
+ * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
8527
+ * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
8528
+ * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
8529
+ create(parentId: Identifier, data: TicketNoteCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<TicketNoteCreate>>;
8530
+ /** Update a record under the parent (PATCH on the collection — swagger documents put+patch there;
8531
+ * the vendor keys the record by the id in the body; OperationResultModel → { id}). `dryRun: true` returns
8532
+ * the pinned envelope with the best-effort diff; a caller-supplied lastModifiedDate that
8533
+ * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
8534
+ update(parentId: Identifier, id: Identifier, data: TicketNoteUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<TicketNoteUpdate>>;
8535
+ /** Resolve a TicketNote from a numeric id (or, where the vendor indexes a primary text field,
8536
+ * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
8537
+ * a bare value rejects with a config error (ids only);
8538
+ * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
8539
+ * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
8540
+ * The compact shape is the structural alias of the full record; `expand: true` is the
8541
+ * type-level escape hatch. */
8542
+ resolve(identifier: number | string, opts?: {
8543
+ expand?: boolean;
8544
+ }): Promise<TicketNoteSummary | null>;
8545
+ }
8546
+
8547
+ /**
8548
+ * TicketNoteWebhooksResource — TicketNoteWebhook resource (G5 batch B, plan key 'ticket_note_webhooks').
8549
+ * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
8550
+ * Do not hand-edit; re-run the generator (the plan is the source of truth).
8551
+ * Parent-scoped child of 'ticket_notes': CRUD under /V1.0/TicketNotes/{parentId}/Webhook —
8552
+ * the global query/count stay unscoped (narrow with the 'parent' filter).
8553
+ */
8554
+
8555
+ /** Query params for TicketNoteWebhooksResource (the G3 filter surface; no per-resource invention). */
8556
+ type TicketNoteWebhooksResourceQueryParams = QueryParams;
8557
+ declare class TicketNoteWebhooksResource extends BaseResource<TicketNoteWebhook, TicketNoteWebhookCreate, TicketNoteWebhookUpdate> {
8558
+ constructor(http: HttpClient, pageSize: number);
8559
+ /** Query TicketNoteWebhook records (global; narrow with the parent filter). */
8560
+ query(params?: TicketNoteWebhooksResourceQueryParams): AsyncIterable<TicketNoteWebhook>;
8561
+ /** Get every TicketNoteWebhook record (the MCP-preferred read; 1000-page guarded). */
8562
+ queryAll(params?: TicketNoteWebhooksResourceQueryParams): Promise<TicketNoteWebhook[]>;
8563
+ /** Count matching records (queryCount envelope unwrapped to a plain number). */
8564
+ count(params?: TicketNoteWebhooksResourceQueryParams): Promise<number>;
8607
8565
  /** Get one record by id (item envelope; item: null → NotFoundError). `fresh: true` bypasses the read-cache lookup and refreshes the entry (issue #250). */
8608
8566
  get(id: Identifier, opts?: {
8609
8567
  fresh?: boolean;
8610
- } | null): Promise<Ticket>;
8568
+ } | null): Promise<TicketNoteWebhook>;
8611
8569
  /** Create a record (OperationResultModel → { id}). `dryRun: true` returns the
8612
8570
  * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
8613
8571
  * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
8614
8572
  * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
8615
- create(data: TicketCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<TicketCreate>>;
8573
+ create(data: TicketNoteWebhookCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<TicketNoteWebhookCreate>>;
8616
8574
  /** Update a record (PUT on the COLLECTION — the vendored spec's item path is GET-only; the vendor
8617
8575
  * keys the record by the id in the body). The vendor validates the FULL model on this route (V2), so a
8618
8576
  * partial body is merged into the CURRENT record first: one fresh GET (which also serves the
@@ -8622,60 +8580,66 @@ declare class TicketsResource extends BaseResource<Ticket, TicketCreate, TicketU
8622
8580
  * `dryRun: true` returns the pinned envelope whose `data` is the merged body (the exact confirmed
8623
8581
  * wire) with the best-effort diff, from that same single read; a caller-supplied lastModifiedDate that
8624
8582
  * mismatches the vendor's current value throws STALE_OBJECT before the mutation. */
8625
- update(id: Identifier, data: TicketUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<TicketUpdate>>;
8626
- /** Resolve a Ticket from a numeric id (or, where the vendor indexes a primary text field,
8627
- * from an exact match on title). A numeric id miss throws NOT_FOUND; a complete
8583
+ update(id: Identifier, data: TicketNoteWebhookUpdate, opts?: MutationOpts): Promise<OperationResult | DryRunResult<TicketNoteWebhookUpdate>>;
8584
+ /** Delete a record (OperationResultModel → { id}). `dryRun: true` returns the pinned
8585
+ * envelope and never issues the delete. */
8586
+ delete(id: Identifier, opts?: MutationOpts): Promise<OperationResult | DryRunResult<Record<string, unknown>>>;
8587
+ /** Resolve a TicketNoteWebhook from a numeric id (or, where the vendor indexes a primary text field,
8588
+ * from an exact match on name). A numeric id miss throws NOT_FOUND; a complete
8628
8589
  * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
8629
8590
  * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
8630
8591
  * The compact shape is the structural alias of the full record; `expand: true` is the
8631
8592
  * type-level escape hatch. */
8632
8593
  resolve(identifier: number | string, opts?: {
8633
8594
  expand?: boolean;
8634
- }): Promise<TicketSummary | null>;
8635
- /** findByTicketNumber — exact 'ticketNumber' filter; ambiguity throws RESOLUTION_AMBIGUOUS with the candidate ids. */
8636
- findByTicketNumber(value: string): Promise<TicketSummary | null>;
8637
- /** Search Ticket records: bounded contains on title (no vendor free-text search exists);
8638
- * limit defaults to 25, max 500. Optional companyID scopes the search to one company's tickets (and-joined
8639
- * with the title match, server-side); includeFields projects the returned columns (id is always returned). */
8595
+ }): Promise<TicketNoteWebhookSummary | null>;
8596
+ /** Search TicketNoteWebhook records: bounded contains on name (no vendor free-text search exists);
8597
+ * limit defaults to 25, max 500. */
8640
8598
  search(query: string, opts?: {
8641
8599
  limit?: number;
8642
- companyID?: Identifier;
8643
- includeFields?: string[];
8644
- }): Promise<TicketSummary[]>;
8645
- /** Get the Ticket with its primary context records in one call (each part a single-record
8646
- * fetch; no sub-lists; absent/dangling references come back null). */
8647
- getContext(id: Identifier): Promise<TicketContext>;
8648
- /** Node-parity special op (hand-written in src/resources/special/tickets.ts). */
8649
- changeStatus(id: Identifier, targetStatus: number, fields?: Record<string, unknown>, opts?: MutationOpts): Promise<TicketChangeStatusResult | TicketChangeStatusNoChange | DryRunResult<Record<string, unknown>>>;
8650
- /** Node-parity special op (hand-written in src/resources/special/tickets.ts). */
8651
- openWithNoteAndAssign(params: OpenWithNoteAndAssignParams, note?: OpenWithNoteAndAssignNote, assign?: OpenWithNoteAndAssignAssign, opts?: MutationOpts): Promise<OpenWithNoteAndAssignResult | DryRunResult<Record<string, unknown>>>;
8652
- /** Node-parity special op (hand-written in src/resources/special/tickets.ts). */
8653
- slaHealthCheck(id: Identifier, opts?: {
8654
- now?: Date;
8655
- }): Promise<TicketSlaHealth>;
8656
- /** Node-parity special op (hand-written in src/resources/special/tickets.ts). */
8657
- summary(id: Identifier, opts?: {
8658
- summaryTextLimit?: number;
8659
- now?: Date;
8660
- }): Promise<TicketSummaryResult>;
8661
- /** Node-parity special op (hand-written in src/resources/special/tickets.ts). */
8662
- timeline(id: Identifier, opts?: {
8663
- since?: string;
8664
- until?: string;
8665
- limit?: number;
8666
- textLimit?: number;
8667
- includeHistories?: boolean;
8668
- }): Promise<TicketTimeline>;
8669
- /** Node-parity special op (hand-written in src/resources/special/tickets.ts). */
8670
- fullContext(id: Identifier, opts?: TicketFullContextOptions): Promise<TicketFullContext>;
8671
- /** Node-parity special op (hand-written in src/resources/special/tickets.ts). */
8672
- statusSemantics(opts?: TicketStatusOptions): Promise<TicketStatusSemantics>;
8673
- /** Node-parity special op (hand-written in src/resources/special/tickets.ts). */
8674
- forResource(resourceID: Identifier, opts?: TicketsForResourceListOptions): Promise<TicketsForResourceResult>;
8675
- forResource(resourceID: Identifier, opts: TicketsForResourceCountOptions): Promise<TicketsForResourceCountResult>;
8676
- forResource(resourceID: Identifier, opts?: TicketsForResourceOptions): Promise<TicketsForResourceResult | TicketsForResourceCountResult>;
8677
- /** Node-parity special op (hand-written in src/resources/special/tickets.ts). */
8678
- lineOfBusiness(ticketId: Identifier, associationId?: Identifier): Promise<TicketLineOfBusinessResult>;
8600
+ }): Promise<TicketNoteWebhookSummary[]>;
8601
+ }
8602
+
8603
+ /**
8604
+ * TicketSecondaryResourcesResource — TicketSecondaryResource resource (G4 batch A, plan key 'ticket_secondary_resources').
8605
+ * GENERATED by scripts/generate-batch.mjs from capabilities.plan.json + api-docs.json.
8606
+ * Do not hand-edit; re-run the generator (the plan is the source of truth).
8607
+ * Parent-scoped child of 'tickets': CRUD under /V1.0/Tickets/{parentId}/SecondaryResources —
8608
+ * the global query/count stay unscoped (narrow with the 'ticketID' filter).
8609
+ */
8610
+
8611
+ /** Query params for TicketSecondaryResourcesResource (the G3 filter surface; no per-resource invention). */
8612
+ type TicketSecondaryResourcesResourceQueryParams = QueryParams;
8613
+ declare class TicketSecondaryResourcesResource extends BaseResource<TicketSecondaryResource, TicketSecondaryResourceCreate, TicketSecondaryResourceUpdate> {
8614
+ constructor(http: HttpClient, pageSize: number);
8615
+ /** Query TicketSecondaryResource records (global; narrow with the ticketID filter). */
8616
+ query(params?: TicketSecondaryResourcesResourceQueryParams): AsyncIterable<TicketSecondaryResource>;
8617
+ /** Get every TicketSecondaryResource record (the MCP-preferred read; 1000-page guarded). */
8618
+ queryAll(params?: TicketSecondaryResourcesResourceQueryParams): Promise<TicketSecondaryResource[]>;
8619
+ /** Count matching records (queryCount envelope unwrapped to a plain number). */
8620
+ count(params?: TicketSecondaryResourcesResourceQueryParams): Promise<number>;
8621
+ /** Get one record by parent + id (/V1.0/Tickets/{parentId}/SecondaryResources/{id} — vendor item envelope; item: null → NotFoundError). */
8622
+ get(parentId: Identifier, id: Identifier, opts?: {
8623
+ fresh?: boolean;
8624
+ } | null): Promise<TicketSecondaryResource>;
8625
+ /** Create a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the
8626
+ * pinned envelope (section 19.3) and never issues the create. A 2xx that is not the
8627
+ * specced envelope runs the plan-pinned marker recovery (issue #13 — one bounded read;
8628
+ * `recoverIdFromMarker: false` restores the pre-recovery behaviour). */
8629
+ create(parentId: Identifier, data: TicketSecondaryResourceCreate, opts?: CreateOpts): Promise<OperationResult | DryRunResult<TicketSecondaryResourceCreate>>;
8630
+ /** Delete a record under the parent (OperationResultModel → { id}). `dryRun: true` returns the pinned
8631
+ * envelope and never issues the delete. */
8632
+ delete(parentId: Identifier, id: Identifier, opts?: MutationOpts): Promise<OperationResult | DryRunResult<Record<string, unknown>>>;
8633
+ /** Resolve a TicketSecondaryResource from a numeric id (or, where the vendor indexes a primary text field,
8634
+ * from a numeric id — this resource has no primary text field). A numeric id miss throws NOT_FOUND;
8635
+ * a bare value rejects with a config error (ids only);
8636
+ * non-match returns null; ambiguity throws RESOLUTION_AMBIGUOUS (candidate ids) and a
8637
+ * cap-tripped bounded client scan throws RESOLUTION_TRUNCATED (never a silent null).
8638
+ * The compact shape is the structural alias of the full record; `expand: true` is the
8639
+ * type-level escape hatch. */
8640
+ resolve(identifier: number | string, opts?: {
8641
+ expand?: boolean;
8642
+ }): Promise<TicketSecondaryResourceSummary | null>;
8679
8643
  }
8680
8644
 
8681
8645
  /**
@@ -8734,70 +8698,85 @@ declare class TicketWebhooksResource extends BaseResource<TicketWebhook, TicketW
8734
8698
  }): Promise<TicketWebhookSummary[]>;
8735
8699
  }
8736
8700
 
8737
- /** The shared window opts (issue #66: the `DateWindowOptions` shape — `now`,
8738
- * `limit`, and the `tz` IANA-zone anchor; omitted `tz` = UTC, the current
8739
- * behaviour bit-for-bit) under its historical name. */
8740
- type TimeEntriesWindowOptions = DateWindowOptions;
8701
+ /** time_entries.moveToTicket (issue #197): create -> verify -> delete on the shared move engine. */
8702
+ type TimeEntriesMoveToTicketOptions = MoveToTicketOptions;
8703
+ type TimeEntriesMoveToTicketResult = MoveResult;
8704
+
8705
+ /**
8706
+ * Posted state of time entries, derived from `billing_items.timeEntryID`.
8707
+ *
8708
+ * This zone's TimeEntry entity has no `postedDate`/`postedOnTime` (reads omit
8709
+ * them, `postedDate` filters 500: W-D3), so the join is the authority: an entry
8710
+ * is posted when a billing item references it. Approval is NOT consulted:
8711
+ * live ww29 2026-10-27 showed `billingApprovalDateTime` is never populated while
8712
+ * billing items DO reference those entries.
8713
+ *
8714
+ * Cost: one `BillingItems/query` per {@link FETCH_BY_IDS_CHUNK_SIZE} ids; the
8715
+ * entry read is capped at 500, so at most 2 joins (250 safe-integer ids serialise
8716
+ * to <= ~4.3k chars, under the 8,000-char filter cap). A 429 (or any other fault)
8717
+ * propagates: no swallow, no per-id fallback.
8718
+ */
8719
+
8720
+ type PostedState = 'posted' | 'unposted';
8721
+
8741
8722
  /**
8742
- * Paging past the 500-entry cap (issue #242), shared by getPosted / getUnposted /
8743
- * postedWithin / dateWorkedWindow. `cursor` pages a busy window across calls (each
8744
- * call stays one entry page + at most 2 joins); `countOnly` returns the window's
8745
- * honest totals in one budgeted call.
8723
+ * Paging past the 500-entry cap (issue #242). `cursor` pages a busy window
8724
+ * across calls (each call stays one entry page + at most 2 joins); `countOnly`
8725
+ * returns the window's honest totals in one budgeted call.
8746
8726
  */
8747
8727
  interface TimeEntriesPostedPagingOptions {
8748
8728
  /** Continue the window: the `nextCursor` of the previous call made with the SAME window and filters. The page is the vendor's continuation page (up to 500 entries; `limit` sizes the first page only), joined the same way. Not with `countOnly`. */
8749
8729
  cursor?: string;
8750
- /** `true`: return only the window's totals (`TimeEntriesPostedCountResult`, no rows). One count call sizes the window, then EVERY entry page is read (ids only) and joined, under `maxVendorCalls`; complete or a typed refusal, never a short total (the distinct-id total must equal the count before or after the walk, else INVALID_RESPONSE). `limit` and `posted` do not apply. */
8730
+ /** `true`: return only the window's totals (`TimeEntriesPostedCountResult`, no rows). One count call sizes the window, then EVERY entry page is read (ids only) and joined, under `maxVendorCalls`; complete or a typed refusal, never a short total (the distinct-id total must equal the count before or after the walk, else INVALID_RESPONSE). `limit` and `state` do not apply. */
8751
8731
  countOnly?: boolean;
8752
8732
  /** The countOnly wire budget (integer 1-200, default 30). An estimate (1 count + 1 per 500 entries + 1 per 250 entries + 1 re-count after the walk) over it refuses with BUDGET_EXCEEDED before any page is read. */
8753
8733
  maxVendorCalls?: number;
8754
8734
  }
8755
- interface TimeEntriesStatusOptions extends TimeEntriesPostedPagingOptions {
8756
- /** Max entries read (default 500 = the hard cap, issue #128); `hasMore` flags a capped read. */
8735
+ /** dateWorkedWindow options: the state narrowing + the eq narrowings + the shared paging bag. */
8736
+ interface TimeEntriesPostedWindowOptions extends TimeEntriesPostedPagingOptions {
8737
+ /** Posted-state narrowing, applied CLIENT-side after the billing-item join: 'posted' = rows a billing item references, 'unposted' = rows none references, omitted = both. No postedDate condition is ever sent. */
8738
+ state?: PostedState;
8739
+ /** Max records (default 500 = the hard cap — a window with more than 500 matching rows: the bounded query op (time_entries.query) with the same dateWorked filter, its 2500-row walk cap; issue #128). */
8757
8740
  limit?: number;
8758
- /** Optional ticketID eq narrowing (node parity). */
8741
+ /** Optional ticketID eq narrowing. */
8759
8742
  ticketID?: number;
8760
- /** Inclusive `dateWorked` window start, 'YYYY-MM-DD' (a calendar day, no tz shift — dateWorked is date-only). */
8761
- /** OPTIONAL, but pass it: a call without dates reads the tenant's first 500 time entries (effectively the oldest), a near-empty/misleading slice with `hasMore` true. */
8762
- dateFrom?: string;
8763
- /** Inclusive `dateWorked` window end, 'YYYY-MM-DD'. */
8764
- /** OPTIONAL, but pass it together with `dateFrom` (see there). */
8765
- dateTo?: string;
8743
+ /** Optional resourceID eq narrowing. */
8744
+ resourceID?: number;
8766
8745
  }
8767
- /** The getPosted / getUnposted result: the classified entries plus an honest truncation flag. */
8768
- interface TimeEntriesPostedStateResult {
8769
- /** getPosted: entries a billing item references. getUnposted: entries no billing item references. */
8746
+ /** Options that select the rows result (`countOnly` absent or false). */
8747
+ type TimeEntriesPostedWindowListOptions = Omit<TimeEntriesPostedWindowOptions, 'countOnly'> & {
8748
+ countOnly?: false;
8749
+ };
8750
+ /** Options that select the count-only result. */
8751
+ type TimeEntriesPostedWindowCountOptions = Omit<TimeEntriesPostedWindowOptions, 'countOnly'> & {
8752
+ countOnly: true;
8753
+ };
8754
+ /** The posted-window read result (issue #10): the window's items + the two-direction count in one pass. */
8755
+ interface TimeEntriesPostedWindowResult {
8756
+ /** The window's entries read, narrowed by `state` when set (bounded by `limit`). */
8770
8757
  items: TimeEntry[];
8771
- /** True when the entry read or a billing-item join page had more rows than one bounded page: the result is partial (a window with more than 500 entries returns the first 500) — narrow the window. */
8772
- hasMore: boolean;
8773
- /** The inclusive dateWorked window queried (second-precision UTC); a side is null when that bound was not given. */
8758
+ /** Of EVERY entry read (before the `state` narrowing), those a billing item references (the join — never a `postedDate` read). With `state` set, `items.length` can differ from postedCount + unpostedCount. */
8759
+ postedCount: number;
8760
+ /** Of EVERY entry read (before the `state` narrowing), those no billing item references — non-zero even with `state: 'posted'` (entries whose join page was truncated are in neither count). */
8761
+ unpostedCount: number;
8762
+ /** The inclusive UTC window actually queried (wire bounds, second precision). */
8774
8763
  window: {
8775
- from: string | null;
8776
- to: string | null;
8764
+ from: string;
8765
+ to: string;
8777
8766
  };
8778
8767
  /** The vendor's next-page cursor for the entry read: pass it back as `opts.cursor` (same window and filters) to read the next page. null on the last page. */
8779
8768
  nextCursor: string | null;
8780
- /** Entries read on this page whose billing-item join page was truncated: withheld from `items` (never called posted or unposted), so a cursor loop does not see them. 0 normally; > 0 also sets `hasMore`. */
8769
+ /** Entries read whose billing-item join page was truncated: in neither count nor a `state`-narrowed `items` (a cursor loop does not see them). 0 normally; > 0 also sets `truncated`. */
8781
8770
  unconfirmed: number;
8782
- /** INFORMATIONAL only, not posted state: items whose `billingApprovalDateTime` is set. Some tenants (ww29) never populate it. */
8783
- approvedCount: number;
8784
- /** INFORMATIONAL only, not posted state: items without `billingApprovalDateTime`. */
8785
- unapprovedCount: number;
8771
+ /** True when the entry read has a live `pageDetails.nextPageUrl` cursor (more matching records than the bounded read returned) OR a billing-item join page was truncated (those entries are in neither count) — the posted/unposted counts then cover the returned rows ONLY (at most `limit`); re-query with a wider window or a narrowing filter to reconcile the totals. */
8772
+ truncated: boolean;
8786
8773
  }
8787
- /** Options that select the rows result (`countOnly` absent or false). */
8788
- type TimeEntriesStatusListOptions = Omit<TimeEntriesStatusOptions, 'countOnly'> & {
8789
- countOnly?: false;
8790
- };
8791
- /** Options that select the count-only result. */
8792
- type TimeEntriesStatusCountOptions = Omit<TimeEntriesStatusOptions, 'countOnly'> & {
8793
- countOnly: true;
8794
- };
8795
8774
  /** The countOnly result (issue #242): the whole window, every entry page read and joined. */
8796
8775
  interface TimeEntriesPostedCountResult {
8797
- /** The inclusive dateWorked window counted (null side when that bound was not given). */
8776
+ /** The inclusive dateWorked window counted. */
8798
8777
  window: {
8799
- from: string | null;
8800
- to: string | null;
8778
+ from: string;
8779
+ to: string;
8801
8780
  };
8802
8781
  /** Entries in the window (every page read; de-duplicated by id). Always postedCount + unpostedCount. */
8803
8782
  total: number;
@@ -8812,154 +8791,6 @@ interface TimeEntriesPostedCountResult {
8812
8791
  /** The budget in force (`maxVendorCalls`). */
8813
8792
  budget: number;
8814
8793
  }
8815
- /** postedWithin options: the optional narrowing + the shared limit bound. */
8816
- interface TimeEntriesPostedWindowOptions extends TimeEntriesPostedPagingOptions {
8817
- /** Posted narrowing, applied CLIENT-side after the billing-item join: `true` = posted rows only, `false` = unposted rows only (entries no billing item references), omitted = both. No postedDate condition is ever sent. */
8818
- posted?: boolean;
8819
- /** Max records (default 500 = the hard cap — a window with more than 500 matching rows: the bounded query op (time_entries.query) with the same dateWorked filter, its 2500-row walk cap; issue #128). */
8820
- limit?: number;
8821
- /** Optional ticketID eq narrowing. */
8822
- ticketID?: number;
8823
- /** Optional resourceID eq narrowing. */
8824
- resourceID?: number;
8825
- /** IANA timezone — accepted and validated, but it never shifts `from`/`to`: `dateWorked` is a date-only value at 00:00 UTC, so those calendar days ARE the bounds (a zone-converted window picked the wrong day behind UTC). */
8826
- tz?: string;
8827
- }
8828
- /** The posted-window read result (issue #10): the window's items + the two-direction count in one pass. */
8829
- interface TimeEntriesPostedWindowResult {
8830
- /** The window's entries read, narrowed by `posted` when set (bounded by `limit`). */
8831
- items: TimeEntry[];
8832
- /** Of EVERY entry read (before the `posted` narrowing), those a billing item references (the join — never a `postedDate` read). With `posted` set, `items.length` can differ from postedCount + unpostedCount. */
8833
- postedCount: number;
8834
- /** Of EVERY entry read (before the `posted` narrowing), those no billing item references — non-zero even with `posted: true` (entries whose join page was truncated are in neither count). */
8835
- unpostedCount: number;
8836
- /** The inclusive UTC window actually queried (wire bounds, second precision). */
8837
- window: {
8838
- from: string;
8839
- to: string;
8840
- };
8841
- /** The vendor's next-page cursor for the entry read: pass it back as `opts.cursor` (same window and filters) to read the next page. null on the last page. */
8842
- nextCursor: string | null;
8843
- /** Entries read whose billing-item join page was truncated: in neither count nor a `posted`-narrowed `items` (a cursor loop does not see them). 0 normally; > 0 also sets `truncated`. */
8844
- unconfirmed: number;
8845
- /** True when the entry read has a live `pageDetails.nextPageUrl` cursor (more matching records than the bounded read returned) OR a billing-item join page was truncated (those entries are in neither count) — the posted/unposted counts then cover the returned rows ONLY (at most `limit`); re-query with a wider window or a narrowing filter to reconcile the totals. */
8846
- truncated: boolean;
8847
- }
8848
- /** Options that select the rows result (`countOnly` absent or false). */
8849
- type TimeEntriesPostedWindowListOptions = Omit<TimeEntriesPostedWindowOptions, 'countOnly'> & {
8850
- countOnly?: false;
8851
- };
8852
- /** Options that select the count-only result. */
8853
- type TimeEntriesPostedWindowCountOptions = Omit<TimeEntriesPostedWindowOptions, 'countOnly'> & {
8854
- countOnly: true;
8855
- };
8856
-
8857
- /**
8858
- * `createForResource` params. The typed linkage pins + the time window are
8859
- * first-class; anything else passes through as a vendor TimeEntry field
8860
- * (read-only + resolver-owned fields are stripped before the wire).
8861
- */
8862
- interface TimeEntriesCreateForResourceParams {
8863
- /**
8864
- * Pin the INTERNAL linkage: an EXISTING active internal allocation code
8865
- * (useType 3). Verified by get (active / family / applicable) — typed
8866
- * failures, never a silent substitute, and never a create.
8867
- */
8868
- internallAllocationCodeID?: number;
8869
- /** Pin the TICKET linkage (vendor gate: roleID is also required — validated as an allocation code). */
8870
- ticketID?: number;
8871
- /** Pin the TASK linkage (vendor gate: roleID is also required — validated as an allocation code). */
8872
- taskID?: number;
8873
- /**
8874
- * TASK/TICKET linkage: pin the roleID value. The vendor validates it as an
8875
- * ALLOCATION CODE (gate 3) — it must be an active general code applicable
8876
- * to the resource. Omit and the resolver picks one.
8877
- */
8878
- roleID?: number;
8879
- /** Date worked, UTC `YYYY-MM-DD` (default: today). */
8880
- dateWorked?: string;
8881
- /** Window start, UTC ISO (default: today `T09:00:00.000Z`). */
8882
- startDateTime?: string;
8883
- /** Window end, UTC ISO (default: today `T18:00:00.000Z`). */
8884
- endDateTime?: string;
8885
- /** Hours worked (default: 8). */
8886
- hoursWorked?: number;
8887
- /** Clock for the window defaults (tests pin it for determinism; stripped before the wire — never sent). */
8888
- now?: Date;
8889
- /**
8890
- * Any other vendor TimeEntry field (summaryNotes, internalNotes,
8891
- * isNonBillable, offsetHours, showOnInvoice, …). Read-only and
8892
- * resolver-owned fields are stripped and never sent.
8893
- */
8894
- [field: string]: unknown;
8895
- }
8896
- /** The allocation code the entry bills against (the resolver's pick or the caller pin). */
8897
- interface TimeEntriesAllocationCodeInfo {
8898
- id: number;
8899
- name: string | null;
8900
- department: number | null;
8901
- billingCodeType: number | null;
8902
- }
8903
- /** Normalised `createForResource` result (the applied path). */
8904
- interface TimeEntriesCreateForResourceResult {
8905
- /** The created TimeEntry id (the vendor OperationResultModel itemId). */
8906
- id: number;
8907
- /** The linkage actually sent: 'internal' | 'task' | 'ticket'. */
8908
- linkage: 'internal' | 'task' | 'ticket';
8909
- /** The allocation code the entry bills against. */
8910
- allocationCode: TimeEntriesAllocationCodeInfo;
8911
- /** TASK/TICKET only: the roleID value actually sent (the H2 code id, or the demoted H1 role id). */
8912
- roleID?: number;
8913
- /** TASK/TICKET only: the 1-based role-ladder position of the successful attempt. */
8914
- roleAttempts?: number;
8915
- /** Discovery-loop field merges applied before success (0 = first-try create). */
8916
- discoveryMerges: number;
8917
- }
8918
-
8919
- /** time_entries.moveToTicket (issue #197): create -> verify -> delete on the shared move engine. */
8920
- type TimeEntriesMoveToTicketOptions = MoveToTicketOptions;
8921
- type TimeEntriesMoveToTicketResult = MoveResult;
8922
-
8923
- /** Options for `time_entries.approve` (the shared mutation bag + the approval pins). */
8924
- interface TimeEntriesApproveOptions extends MutationOpts {
8925
- /** The approving resource id (default: the time entry's own resourceID). */
8926
- approvalResourceID?: Identifier;
8927
- /** The approval level (1-based integer, default 1). */
8928
- approvalLevel?: number;
8929
- /** The approval instant (ISO string or Date, default: now). */
8930
- approvalDateTime?: string | Date;
8931
- }
8932
- /**
8933
- * `approved`: the approval level was created AND the follow-up update
8934
- * persisted both time-entry fields (verified by the read-back).
8935
- * `approval_fields_not_persisted`: the approval level was created but the
8936
- * read-back shows the vendor kept the old billingApprovalDateTime /
8937
- * billingApprovalResourceID — re-apply, or set them in the Autotask UI.
8938
- */
8939
- type TimeEntriesApproveStatus = 'approved' | 'approval_fields_not_persisted';
8940
- /** What `time_entries.approve` returns on the applied path. */
8941
- interface TimeEntriesApproveResult {
8942
- /** The approved time entry. */
8943
- timeEntryID: number;
8944
- /** The id of the created BillingItemApprovalLevels record. */
8945
- billingItemApprovalLevelID: number;
8946
- /** The approval level sent (1-based). */
8947
- approvalLevel: number;
8948
- /** The approving resource id sent. */
8949
- approvalResourceID: number;
8950
- /** The approval instant sent (ISO 8601). */
8951
- approvalDateTime: string;
8952
- /** Read back from the time entry: the vendor's most-recent level (null when unset). */
8953
- billingApprovalLevelMostRecent: number | null;
8954
- /** Read back from the time entry: the persisted approval instant (null when unset). */
8955
- billingApprovalDateTime: string | null;
8956
- /** Read back from the time entry: the persisted approving resource (null when unset). */
8957
- billingApprovalResourceID: number | null;
8958
- /** Honest outcome of the two-call sequence. */
8959
- status: TimeEntriesApproveStatus;
8960
- /** `status === 'approved'` (true only when the read-back matched what was sent). */
8961
- persisted: boolean;
8962
- }
8963
8794
 
8964
8795
  /**
8965
8796
  * TimeEntriesResource — TimeEntry resource (G5 batch B, plan key 'time_entries').
@@ -9009,52 +8840,12 @@ declare class TimeEntriesResource extends BaseResource<TimeEntry, TimeEntryCreat
9009
8840
  resolve(identifier: number | string, opts?: {
9010
8841
  expand?: boolean;
9011
8842
  }): Promise<TimeEntrySummary | null>;
9012
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9013
- approve(id: Identifier, opts?: TimeEntriesApproveOptions): Promise<TimeEntriesApproveResult | DryRunResult<Record<string, unknown>>>;
9014
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9015
- createForResource(resourceID: Identifier, params: TimeEntriesCreateForResourceParams, opts?: MutationOpts): Promise<TimeEntriesCreateForResourceResult | DryRunResult<Record<string, unknown>>>;
9016
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9017
- customRange(from: string, to: string, opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9018
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
8843
+ /** Node-parity special op (hand-written in src/resources/special/time_entries/windows.ts). */
9019
8844
  dateWorkedWindow(from: string, to: string, opts?: TimeEntriesPostedWindowListOptions): Promise<TimeEntriesPostedWindowResult>;
9020
8845
  dateWorkedWindow(from: string, to: string, opts: TimeEntriesPostedWindowCountOptions): Promise<TimeEntriesPostedCountResult>;
9021
8846
  dateWorkedWindow(from: string, to: string, opts?: TimeEntriesPostedWindowOptions): Promise<TimeEntriesPostedWindowResult | TimeEntriesPostedCountResult>;
9022
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9023
- getPosted(opts?: TimeEntriesStatusListOptions): Promise<TimeEntriesPostedStateResult>;
9024
- getPosted(opts: TimeEntriesStatusCountOptions): Promise<TimeEntriesPostedCountResult>;
9025
- getPosted(opts?: TimeEntriesStatusOptions): Promise<TimeEntriesPostedStateResult | TimeEntriesPostedCountResult>;
9026
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9027
- getUnposted(opts?: TimeEntriesStatusListOptions): Promise<TimeEntriesPostedStateResult>;
9028
- getUnposted(opts: TimeEntriesStatusCountOptions): Promise<TimeEntriesPostedCountResult>;
9029
- getUnposted(opts?: TimeEntriesStatusOptions): Promise<TimeEntriesPostedStateResult | TimeEntriesPostedCountResult>;
9030
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9031
- last14(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9032
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9033
- last24h(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9034
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9035
- last30(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9036
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9037
- last7(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9038
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9039
- last90(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9040
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9041
- lastFullFortnight(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9042
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9043
- lastFullMonth(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9044
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9045
- lastFullQuarter(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9046
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9047
- lastFullWeek(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9048
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
8847
+ /** Node-parity special op (hand-written in src/resources/special/time_entries/move.ts). */
9049
8848
  moveToTicket(sourceId: Identifier, toTicketId: Identifier, opts?: TimeEntriesMoveToTicketOptions): Promise<TimeEntriesMoveToTicketResult | DryRunResult<Record<string, unknown>>>;
9050
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9051
- postedWithin(from: string, to: string, opts?: TimeEntriesPostedWindowListOptions): Promise<TimeEntriesPostedWindowResult>;
9052
- postedWithin(from: string, to: string, opts: TimeEntriesPostedWindowCountOptions): Promise<TimeEntriesPostedCountResult>;
9053
- postedWithin(from: string, to: string, opts?: TimeEntriesPostedWindowOptions): Promise<TimeEntriesPostedWindowResult | TimeEntriesPostedCountResult>;
9054
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9055
- today(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9056
- /** Node-parity special op (hand-written in src/resources/special/time_entries.ts). */
9057
- yesterday(opts?: TimeEntriesWindowOptions): Promise<TimeEntry[]>;
9058
8849
  }
9059
8850
 
9060
8851
  /**
@@ -9399,4 +9190,5 @@ declare class AutotaskClient {
9399
9190
  }): Promise<PromiseSettledResult<R>[]>;
9400
9191
  }
9401
9192
 
9402
- export { ConfigurationItemSslSubjectAlternativeNamesResource as $, type AutotaskConfig as A, BillingCodesResource as B, type CreateIfNotExistsResult as C, CompanyLocationsResource as D, type CompanyLocationsResourceQueryParams as E, CompanyNotesResource as F, type CompanyNotesResourceQueryParams as G, CompanySiteConfigurationsResource as H, type CompanySiteConfigurationsResourceQueryParams as I, CompanyWebhooksResource as J, type CompanyWebhooksResourceQueryParams as K, type ConfigProfile as L, ConfigurationItemBillingProductAssociationsResource as M, type ConfigurationItemBillingProductAssociationsResourceQueryParams as N, ConfigurationItemCategoriesResource as O, type ConfigurationItemCategoriesResourceQueryParams as P, ConfigurationItemCategoryUdfAssociationsResource as Q, type ResolvedAutotaskConfig as R, type ConfigurationItemCategoryUdfAssociationsResourceQueryParams as S, TtlCache as T, ConfigurationItemDnsRecordsResource as U, type ConfigurationItemDnsRecordsResourceQueryParams as V, ConfigurationItemNotesResource as W, type ConfigurationItemNotesResourceQueryParams as X, ConfigurationItemRelatedItemsResource as Y, type ZoneName as Z, type ConfigurationItemRelatedItemsResourceQueryParams as _, AutotaskClient as a, CurrenciesResource as a$, type ConfigurationItemSslSubjectAlternativeNamesResourceQueryParams as a0, ConfigurationItemTypesResource as a1, type ConfigurationItemTypesResourceQueryParams as a2, ConfigurationItemWebhooksResource as a3, type ConfigurationItemWebhooksResourceQueryParams as a4, ConfigurationItemsResource as a5, type ConfigurationItemsResourceQueryParams as a6, ContactGroupContactsResource as a7, type ContactGroupContactsResourceQueryParams as a8, ContactGroupsResource as a9, type ContractNotesResourceQueryParams as aA, ContractRatesResource as aB, type ContractRatesResourceQueryParams as aC, ContractRetainersResource as aD, type ContractRetainersResourceQueryParams as aE, ContractRoleCostsResource as aF, type ContractRoleCostsResourceQueryParams as aG, ContractServiceAdjustmentsResource as aH, type ContractServiceAdjustmentsResourceQueryParams as aI, ContractServiceBundleAdjustmentsResource as aJ, type ContractServiceBundleAdjustmentsResourceQueryParams as aK, ContractServiceBundleUnitsResource as aL, type ContractServiceBundleUnitsResourceQueryParams as aM, ContractServiceBundlesResource as aN, type ContractServiceBundlesResourceQueryParams as aO, ContractServiceUnitsResource as aP, type ContractServiceUnitsResourceQueryParams as aQ, ContractServicesResource as aR, type ContractServicesResourceQueryParams as aS, ContractTicketPurchasesResource as aT, type ContractTicketPurchasesResourceQueryParams as aU, type ContractsProfitabilityResult as aV, ContractsResource as aW, type ContractsResourceQueryParams as aX, type CostRateResolution as aY, CountriesResource as aZ, type CountriesResourceQueryParams as a_, type ContactGroupsResourceQueryParams as aa, ContactWebhooksResource as ab, type ContactWebhooksResourceQueryParams as ac, ContactsResource as ad, type ContactsResourceQueryParams as ae, ContractBillingRulesResource as af, type ContractBillingRulesResourceQueryParams as ag, ContractBlockHourFactorsResource as ah, type ContractBlockHourFactorsResourceQueryParams as ai, ContractBlocksResource as aj, type ContractBlocksResourceQueryParams as ak, ContractChargesResource as al, type ContractChargesResourceQueryParams as am, ContractExclusionBillingCodesResource as an, type ContractExclusionBillingCodesResourceQueryParams as ao, ContractExclusionRolesResource as ap, type ContractExclusionRolesResourceQueryParams as aq, ContractExclusionSetExcludedRolesResource as ar, type ContractExclusionSetExcludedRolesResourceQueryParams as as, ContractExclusionSetExcludedWorkTypesResource as at, type ContractExclusionSetExcludedWorkTypesResourceQueryParams as au, ContractExclusionSetsResource as av, type ContractExclusionSetsResourceQueryParams as aw, ContractMilestonesResource as ax, type ContractMilestonesResourceQueryParams as ay, ContractNotesResource as az, type RequestOptions as b, type ProfitabilityPartDigest as b$, type CurrenciesResourceQueryParams as b0, DEFAULT_ZONE as b1, DepartmentsResource as b2, type DepartmentsResourceQueryParams as b3, DomainRegistrarsResource as b4, type DomainRegistrarsResourceQueryParams as b5, EntityInformationResource as b6, ExpenseItemAttachmentsResource as b7, type ExpenseItemAttachmentsResourceQueryParams as b8, ExpenseItemsResource as b9, type OpportunityAttachmentsResourceQueryParams as bA, OpportunityCategoriesResource as bB, type OpportunityCategoriesResourceQueryParams as bC, OrganizationalLevel1sResource as bD, type OrganizationalLevel1sResourceQueryParams as bE, OrganizationalLevel2sResource as bF, type OrganizationalLevel2sResourceQueryParams as bG, OrganizationalLevelAssociationsResource as bH, type OrganizationalLevelAssociationsResourceQueryParams as bI, type PageFetcher as bJ, type PaginateOptions as bK, PhasesResource as bL, type PhasesResourceQueryParams as bM, ProductVendorsResource as bN, type ProductVendorsResourceQueryParams as bO, ProductsResource as bP, type ProductsResourceQueryParams as bQ, type ProfitRateSource as bR, type ProfitabilityActivityCategory as bS, type ProfitabilityDataQualityWarning as bT, type ProfitabilityHighestCostTicket as bU, type ProfitabilityLabourCostMethod as bV, type ProfitabilityMiscoding as bW, type ProfitabilityMonthlyRow as bX, type ProfitabilityOpenRenewalItem as bY, type ProfitabilityOptions as bZ, type ProfitabilityPart as b_, type ExpenseItemsResourceQueryParams as ba, ExpenseReportsResource as bb, type ExpenseReportsResourceQueryParams as bc, FIELD_CACHE_KINDS as bd, type FieldCacheKind as be, HolidaySetsResource as bf, type HolidaySetsResourceQueryParams as bg, HolidaysResource as bh, type HolidaysResourceQueryParams as bi, HttpClient as bj, IDEMPOTENT_METHODS as bk, InventoryProductsResource as bl, type InventoryProductsResourceQueryParams as bm, InvoiceTemplatesResource as bn, type InvoiceTemplatesResourceQueryParams as bo, InvoicesResource as bp, type InvoicesResourceQueryParams as bq, type Logger as br, MAX_PAGES as bs, ModulesResource as bt, NoopLogger as bu, NotificationHistoryResource as bv, type NotificationHistoryResourceQueryParams as bw, OpportunitiesResource as bx, type OpportunitiesResourceQueryParams as by, OpportunityAttachmentsResource as bz, type TicketChangeStatusResult as c, SubscriptionsResource as c$, type ProfitabilityRevenueByType as c0, ProjectChargesResource as c1, type ProjectChargesResourceQueryParams as c2, ProjectNotesResource as c3, type ProjectNotesResourceQueryParams as c4, ProjectsResource as c5, type ProjectsResourceQueryParams as c6, PurchaseApprovalsResource as c7, type PurchaseApprovalsResourceQueryParams as c8, PurchaseOrderItemReceivingResource as c9, type ResourceTimeOffApproversResourceQueryParams as cA, ResourceTimeOffBalancesResource as cB, type ResourceTimeOffBalancesResourceQueryParams as cC, ResourcesResource as cD, type ResourcesResourceQueryParams as cE, RolesResource as cF, type RolesResourceQueryParams as cG, SalesOrdersResource as cH, type SalesOrdersResourceQueryParams as cI, ServiceCallTaskResourcesResource as cJ, type ServiceCallTaskResourcesResourceQueryParams as cK, ServiceCallTasksResource as cL, type ServiceCallTasksResourceQueryParams as cM, ServiceCallTicketResourcesResource as cN, type ServiceCallTicketResourcesResourceQueryParams as cO, ServiceCallTicketsResource as cP, type ServiceCallTicketsResourceQueryParams as cQ, ServiceCallsResource as cR, type ServiceCallsResourceQueryParams as cS, ServiceLevelAgreementResultsResource as cT, type ServiceLevelAgreementResultsResourceQueryParams as cU, ServicesResource as cV, type ServicesResourceQueryParams as cW, SkillsResource as cX, type SkillsResourceQueryParams as cY, SubscriptionPeriodsResource as cZ, type SubscriptionPeriodsResourceQueryParams as c_, type PurchaseOrderItemReceivingResourceQueryParams as ca, PurchaseOrderItemsResource as cb, type PurchaseOrderItemsResourceQueryParams as cc, PurchaseOrdersResource as cd, type PurchaseOrdersResourceQueryParams as ce, QuoteItemsResource as cf, type QuoteItemsResourceQueryParams as cg, QuoteLocationsResource as ch, type QuoteLocationsResourceQueryParams as ci, QuoteTemplatesResource as cj, type QuoteTemplatesResourceQueryParams as ck, QuotesResource as cl, type QuotesResourceQueryParams as cm, READ_CACHE_MAX_ENTRIES as cn, REDACTED as co, REFERENCE_ENTITIES as cp, REFERENCE_TTL_MS as cq, ResourceRoleQueuesResource as cr, type ResourceRoleQueuesResourceQueryParams as cs, ResourceRolesResource as ct, type ResourceRolesResourceQueryParams as cu, ResourceSkillsResource as cv, type ResourceSkillsResourceQueryParams as cw, ResourceTimeOffAdditionalResource as cx, type ResourceTimeOffAdditionalResourceQueryParams as cy, ResourceTimeOffApproversResource as cz, type TicketChangeStatusNoChange as d, TimeEntryAttachmentsResource as d$, type SubscriptionsResourceQueryParams as d0, SurveyResultsResource as d1, type SurveyResultsResourceQueryParams as d2, SurveysResource as d3, type SurveysResourceQueryParams as d4, TagAliasesResource as d5, type TagAliasesResourceQueryParams as d6, TagGroupsResource as d7, type TagGroupsResourceQueryParams as d8, TagsResource as d9, type TicketChecklistLibrariesResourceQueryParams as dA, TicketHistoryResource as dB, type TicketHistoryResourceQueryParams as dC, TicketNoteAttachmentsResource as dD, type TicketNoteAttachmentsResourceQueryParams as dE, TicketNoteWebhooksResource as dF, type TicketNoteWebhooksResourceQueryParams as dG, TicketNotesResource as dH, type TicketNotesResourceQueryParams as dI, TicketSecondaryResourcesResource as dJ, type TicketSecondaryResourcesResourceQueryParams as dK, TicketWebhooksResource as dL, type TicketWebhooksResourceQueryParams as dM, TicketsResource as dN, type TicketsResourceQueryParams as dO, type TimeEntriesPostedCountResult as dP, type TimeEntriesPostedPagingOptions as dQ, type TimeEntriesPostedStateResult as dR, type TimeEntriesPostedWindowCountOptions as dS, type TimeEntriesPostedWindowListOptions as dT, type TimeEntriesPostedWindowOptions as dU, type TimeEntriesPostedWindowResult as dV, TimeEntriesResource as dW, type TimeEntriesResourceQueryParams as dX, type TimeEntriesStatusCountOptions as dY, type TimeEntriesStatusListOptions as dZ, type TimeEntriesStatusOptions as d_, type TagsResourceQueryParams as da, TaskSecondaryResourcesResource as db, type TaskSecondaryResourcesResourceQueryParams as dc, TasksResource as dd, type TasksResourceQueryParams as de, TaxRegionsResource as df, type TaxRegionsResourceQueryParams as dg, ThresholdInformationResource as dh, TicketAdditionalConfigurationItemsResource as di, type TicketAdditionalConfigurationItemsResourceQueryParams as dj, TicketAdditionalContactsResource as dk, type TicketAdditionalContactsResourceQueryParams as dl, TicketAttachmentsResource as dm, type TicketAttachmentsResourceQueryParams as dn, TicketCategoriesResource as dp, type TicketCategoriesResourceQueryParams as dq, TicketCategoryFieldDefaultsResource as dr, type TicketCategoryFieldDefaultsResourceQueryParams as ds, TicketChangeRequestApprovalsResource as dt, type TicketChangeRequestApprovalsResourceQueryParams as du, TicketChargesResource as dv, type TicketChargesResourceQueryParams as dw, TicketChecklistItemsResource as dx, type TicketChecklistItemsResourceQueryParams as dy, TicketChecklistLibrariesResource as dz, AGENT_PROFILE as e, type TimeEntryAttachmentsResourceQueryParams as e0, TimeOffRequestsResource as e1, type TimeOffRequestsResourceQueryParams as e2, type TtlCacheOptions as e3, VersionInformationResource as e4, VersionResource as e5, ZONES as e6, ZONE_CATALOG as e7, ZoneInformationResource as e8, clampPageSize as e9, collectAll as ea, fieldKey as eb, isCredentialHeaderName as ec, paginate as ed, paginateItems as ee, readTtlFor as ef, redactRecord as eg, resolveBaseUrl as eh, toArray as ei, totalPagesFor as ej, zoneUrl as ek, type BlindSurfaceInfo as el, type RelationshipResource as em, type BlindSurfaceInventory as en, type BlindSurfaceRow as eo, type CreateGuidanceValueRequirement as ep, type CreateGuidanceRow as eq, type CreateBlockerKind as er, type CreateGuidanceReport as es, AppointmentsResource as f, type AppointmentsResourceQueryParams as g, AuthenticateResource as h, type BillingCodesResourceQueryParams as i, BillingItemApprovalLevelsResource as j, type BillingItemApprovalLevelsResourceQueryParams as k, BillingItemsResource as l, type BillingItemsResourceQueryParams as m, CREDENTIAL_HEADER_NAMES as n, ChangeRequestLinksResource as o, type ChangeRequestLinksResourceQueryParams as p, ChecklistLibrariesResource as q, type ChecklistLibrariesResourceQueryParams as r, ChecklistLibraryChecklistItemsResource as s, type ChecklistLibraryChecklistItemsResourceQueryParams as t, ClassificationIconsResource as u, type ClassificationIconsResourceQueryParams as v, CompaniesResource as w, type CompaniesResourceQueryParams as x, CompanyAlertsResource as y, type CompanyAlertsResourceQueryParams as z };
9193
+ export { ConfigurationItemCategoryUdfAssociationsResource as $, ClassificationIconsResource as E, CompaniesResource as H, CompanyAlertsResource as J, CompanyLocationsResource as L, CompanyNotesResource as N, CompanySiteConfigurationsResource as P, CompanyWebhooksResource as S, TtlCache as T, ConfigurationItemBillingProductAssociationsResource as W, ConfigurationItemCategoriesResource as Y, AutotaskClient as a, ContractTicketPurchasesResource as a$, ConfigurationItemDnsRecordsResource as a1, ConfigurationItemNotesResource as a3, ConfigurationItemRelatedItemsResource as a5, ConfigurationItemSslSubjectAlternativeNamesResource as a7, ConfigurationItemTypesResource as a9, ContractExclusionSetExcludedWorkTypesResource as aB, ContractExclusionSetsResource as aD, ContractMilestonesResource as aF, ContractNotesResource as aH, ContractRatesResource as aJ, ContractRetainersResource as aL, ContractRoleCostsResource as aN, ContractServiceAdjustmentsResource as aP, ContractServiceBundleAdjustmentsResource as aR, ContractServiceBundleUnitsResource as aT, ContractServiceBundlesResource as aV, ContractServiceUnitsResource as aX, ContractServicesResource as aZ, ConfigurationItemWebhooksResource as ab, ConfigurationItemsResource as ad, ContactGroupContactsResource as af, ContactGroupsResource as ah, ContactWebhooksResource as aj, ContactsResource as al, ContractBillingRulesResource as an, ContractBlockHourFactorsResource as ap, ContractBlocksResource as ar, ContractChargesResource as at, ContractExclusionBillingCodesResource as av, ContractExclusionRolesResource as ax, ContractExclusionSetExcludedRolesResource as az, ContractsResource as b2, CountriesResource as b5, CurrenciesResource as b7, DEFAULT_ZONE as b9, NoopLogger as bA, NotificationHistoryResource as bB, OpportunitiesResource as bD, OpportunityAttachmentsResource as bF, OpportunityCategoriesResource as bH, OrganizationalLevel1sResource as bJ, OrganizationalLevel2sResource as bL, OrganizationalLevelAssociationsResource as bN, PhasesResource as bR, ProductVendorsResource as bT, ProductsResource as bV, DepartmentsResource as ba, DomainRegistrarsResource as bc, EntityInformationResource as be, ExpenseItemAttachmentsResource as bf, ExpenseItemsResource as bh, ExpenseReportsResource as bj, HolidaySetsResource as bl, HolidaysResource as bn, HttpClient as bp, IDEMPOTENT_METHODS as bq, InventoryProductsResource as br, InvoiceTemplatesResource as bt, InvoicesResource as bv, MAX_PAGES as by, ModulesResource as bz, ServicesResource as c$, ProjectChargesResource as c7, ProjectNotesResource as c9, ResourceSkillsResource as cB, ResourceTimeOffAdditionalResource as cD, ResourceTimeOffApproversResource as cF, ResourceTimeOffBalancesResource as cH, ResourcesResource as cJ, RolesResource as cL, SalesOrdersResource as cN, ServiceCallTaskResourcesResource as cP, ServiceCallTasksResource as cR, ServiceCallTicketResourcesResource as cT, ServiceCallTicketsResource as cV, ServiceCallsResource as cX, ServiceLevelAgreementResultsResource as cZ, ProjectsResource as cb, PurchaseApprovalsResource as cd, PurchaseOrderItemReceivingResource as cf, PurchaseOrderItemsResource as ch, PurchaseOrdersResource as cj, QuoteItemsResource as cl, QuoteLocationsResource as cn, QuoteTemplatesResource as cp, QuotesResource as cr, READ_CACHE_MAX_ENTRIES as ct, REDACTED as cu, REFERENCE_ENTITIES as cv, REFERENCE_TTL_MS as cw, ResourceRoleQueuesResource as cx, ResourceRolesResource as cz, TimeEntriesResource as d$, SkillsResource as d1, SubscriptionPeriodsResource as d3, SubscriptionsResource as d5, SurveyResultsResource as d7, SurveysResource as d9, TicketChargesResource as dB, TicketChecklistItemsResource as dD, TicketChecklistLibrariesResource as dF, TicketHistoryResource as dH, TicketNoteAttachmentsResource as dJ, TicketNoteWebhooksResource as dL, TicketNotesResource as dN, TicketSecondaryResourcesResource as dP, TicketWebhooksResource as dR, TicketsResource as dT, TagAliasesResource as db, TagGroupsResource as dd, TagsResource as df, TaskSecondaryResourcesResource as dh, TasksResource as dj, TaxRegionsResource as dl, ThresholdInformationResource as dn, TicketAdditionalConfigurationItemsResource as dp, TicketAdditionalContactsResource as dr, TicketAttachmentsResource as dt, TicketCategoriesResource as dv, TicketCategoryFieldDefaultsResource as dx, TicketChangeRequestApprovalsResource as dz, TimeEntryAttachmentsResource as e1, TimeOffRequestsResource as e3, VersionInformationResource as e6, VersionResource as e7, ZONES as e8, ZONE_CATALOG as e9, ZoneInformationResource as ea, clampPageSize as eb, collectAll as ec, fieldKey as ed, isCredentialHeaderName as ee, paginate as ef, paginateItems as eg, readTtlFor as eh, redactRecord as ei, resolveBaseUrl as ej, toArray as ek, totalPagesFor as el, zoneUrl as em, FIELD_CACHE_KINDS as f, AGENT_PROFILE as k, AppointmentsResource as l, AuthenticateResource as n, BillingCodesResource as o, BillingItemApprovalLevelsResource as q, BillingItemsResource as s, CREDENTIAL_HEADER_NAMES as u, ChangeRequestLinksResource as v, ChecklistLibrariesResource as x, ChecklistLibraryChecklistItemsResource as z };
9194
+ export type { AutotaskConfig as A, BlindSurfaceInfo as B, CreateGuidanceValueRequirement as C, ChecklistLibraryChecklistItemsResourceQueryParams as D, FieldCacheKind as F, ClassificationIconsResourceQueryParams as G, CompaniesResourceQueryParams as I, CompanyAlertsResourceQueryParams as K, CompanyLocationsResourceQueryParams as M, CompanyNotesResourceQueryParams as O, CompanySiteConfigurationsResourceQueryParams as Q, RowNamesSummary as R, CompanyWebhooksResourceQueryParams as U, ConfigProfile as V, ConfigurationItemBillingProductAssociationsResourceQueryParams as X, ZoneName as Z, ConfigurationItemCategoriesResourceQueryParams as _, ConfigurationItemCategoryUdfAssociationsResourceQueryParams as a0, ConfigurationItemDnsRecordsResourceQueryParams as a2, ConfigurationItemNotesResourceQueryParams as a4, ConfigurationItemRelatedItemsResourceQueryParams as a6, ConfigurationItemSslSubjectAlternativeNamesResourceQueryParams as a8, ContractExclusionSetExcludedRolesResourceQueryParams as aA, ContractExclusionSetExcludedWorkTypesResourceQueryParams as aC, ContractExclusionSetsResourceQueryParams as aE, ContractMilestonesResourceQueryParams as aG, ContractNotesResourceQueryParams as aI, ContractRatesResourceQueryParams as aK, ContractRetainersResourceQueryParams as aM, ContractRoleCostsResourceQueryParams as aO, ContractServiceAdjustmentsResourceQueryParams as aQ, ContractServiceBundleAdjustmentsResourceQueryParams as aS, ContractServiceBundleUnitsResourceQueryParams as aU, ContractServiceBundlesResourceQueryParams as aW, ContractServiceUnitsResourceQueryParams as aY, ContractServicesResourceQueryParams as a_, ConfigurationItemTypesResourceQueryParams as aa, ConfigurationItemWebhooksResourceQueryParams as ac, ConfigurationItemsResourceQueryParams as ae, ContactGroupContactsResourceQueryParams as ag, ContactGroupsResourceQueryParams as ai, ContactWebhooksResourceQueryParams as ak, ContactsResourceQueryParams as am, ContractBillingRulesResourceQueryParams as ao, ContractBlockHourFactorsResourceQueryParams as aq, ContractBlocksResourceQueryParams as as, ContractChargesResourceQueryParams as au, ContractExclusionBillingCodesResourceQueryParams as aw, ContractExclusionRolesResourceQueryParams as ay, RelationshipResource as b, ProfitabilityLabourCostMethod as b$, ContractTicketPurchasesResourceQueryParams as b0, ContractsProfitabilityResult as b1, ContractsResourceQueryParams as b3, CostRateResolution as b4, CountriesResourceQueryParams as b6, CurrenciesResourceQueryParams as b8, NotificationHistoryResourceQueryParams as bC, OpportunitiesResourceQueryParams as bE, OpportunityAttachmentsResourceQueryParams as bG, OpportunityCategoriesResourceQueryParams as bI, OrganizationalLevel1sResourceQueryParams as bK, OrganizationalLevel2sResourceQueryParams as bM, OrganizationalLevelAssociationsResourceQueryParams as bO, PageFetcher as bP, PaginateOptions as bQ, PhasesResourceQueryParams as bS, ProductVendorsResourceQueryParams as bU, ProductsResourceQueryParams as bW, ProfitRateSource as bX, ProfitabilityActivityCategory as bY, ProfitabilityDataQualityWarning as bZ, ProfitabilityHighestCostTicket as b_, DepartmentsResourceQueryParams as bb, DomainRegistrarsResourceQueryParams as bd, ExpenseItemAttachmentsResourceQueryParams as bg, ExpenseItemsResourceQueryParams as bi, ExpenseReportsResourceQueryParams as bk, HolidaySetsResourceQueryParams as bm, HolidaysResourceQueryParams as bo, InventoryProductsResourceQueryParams as bs, InvoiceTemplatesResourceQueryParams as bu, InvoicesResourceQueryParams as bw, Logger as bx, CreateGuidanceRow as c, ProfitabilityMiscoding as c0, ProfitabilityMonthlyRow as c1, ProfitabilityOpenRenewalItem as c2, ProfitabilityOptions as c3, ProfitabilityPart as c4, ProfitabilityPartDigest as c5, ProfitabilityRevenueByType as c6, ProjectChargesResourceQueryParams as c8, ResourceRolesResourceQueryParams as cA, ResourceSkillsResourceQueryParams as cC, ResourceTimeOffAdditionalResourceQueryParams as cE, ResourceTimeOffApproversResourceQueryParams as cG, ResourceTimeOffBalancesResourceQueryParams as cI, ResourcesResourceQueryParams as cK, RolesResourceQueryParams as cM, SalesOrdersResourceQueryParams as cO, ServiceCallTaskResourcesResourceQueryParams as cQ, ServiceCallTasksResourceQueryParams as cS, ServiceCallTicketResourcesResourceQueryParams as cU, ServiceCallTicketsResourceQueryParams as cW, ServiceCallsResourceQueryParams as cY, ServiceLevelAgreementResultsResourceQueryParams as c_, ProjectNotesResourceQueryParams as ca, ProjectsResourceQueryParams as cc, PurchaseApprovalsResourceQueryParams as ce, PurchaseOrderItemReceivingResourceQueryParams as cg, PurchaseOrderItemsResourceQueryParams as ci, PurchaseOrdersResourceQueryParams as ck, QuoteItemsResourceQueryParams as cm, QuoteLocationsResourceQueryParams as co, QuoteTemplatesResourceQueryParams as cq, QuotesResourceQueryParams as cs, ResourceRoleQueuesResourceQueryParams as cy, CreateBlockerKind as d, ServicesResourceQueryParams as d0, SkillsResourceQueryParams as d2, SubscriptionPeriodsResourceQueryParams as d4, SubscriptionsResourceQueryParams as d6, SurveyResultsResourceQueryParams as d8, TicketChangeRequestApprovalsResourceQueryParams as dA, TicketChargesResourceQueryParams as dC, TicketChecklistItemsResourceQueryParams as dE, TicketChecklistLibrariesResourceQueryParams as dG, TicketHistoryResourceQueryParams as dI, TicketNoteAttachmentsResourceQueryParams as dK, TicketNoteWebhooksResourceQueryParams as dM, TicketNotesResourceQueryParams as dO, TicketSecondaryResourcesResourceQueryParams as dQ, TicketWebhooksResourceQueryParams as dS, TicketsResourceQueryParams as dU, TimeEntriesPostedCountResult as dV, TimeEntriesPostedPagingOptions as dW, TimeEntriesPostedWindowCountOptions as dX, TimeEntriesPostedWindowListOptions as dY, TimeEntriesPostedWindowOptions as dZ, TimeEntriesPostedWindowResult as d_, SurveysResourceQueryParams as da, TagAliasesResourceQueryParams as dc, TagGroupsResourceQueryParams as de, TagsResourceQueryParams as dg, TaskSecondaryResourcesResourceQueryParams as di, TasksResourceQueryParams as dk, TaxRegionsResourceQueryParams as dm, TicketAdditionalConfigurationItemsResourceQueryParams as dq, TicketAdditionalContactsResourceQueryParams as ds, TicketAttachmentsResourceQueryParams as du, TicketCategoriesResourceQueryParams as dw, TicketCategoryFieldDefaultsResourceQueryParams as dy, CreateGuidanceReport as e, TimeEntriesResourceQueryParams as e0, TimeEntryAttachmentsResourceQueryParams as e2, TimeOffRequestsResourceQueryParams as e4, TtlCacheOptions as e5, ResolvedAutotaskConfig as g, RequestOptions as h, TicketChangeStatusResult as i, TicketChangeStatusNoChange as j, AppointmentsResourceQueryParams as m, BillingCodesResourceQueryParams as p, BillingItemApprovalLevelsResourceQueryParams as r, BillingItemsResourceQueryParams as t, ChangeRequestLinksResourceQueryParams as w, ChecklistLibrariesResourceQueryParams as y };