@tangle-network/agent-integrations 0.53.2 → 0.53.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9481,6 +9481,437 @@ async function ensureFreshAccessTokenFromCreds(creds, clientId, clientSecret, on
9481
9481
  return creds.accessToken;
9482
9482
  }
9483
9483
 
9484
+ // src/connectors/adapters/quickbooks.ts
9485
+ var quickbooksConnector = declarativeRestConnector({
9486
+ kind: "quickbooks",
9487
+ displayName: "QuickBooks",
9488
+ description: "Query QuickBooks Online entities with SQL-like queries and create or update customers, invoices, and items.",
9489
+ auth: {
9490
+ kind: "oauth2",
9491
+ authorizationUrl: "https://appcenter.intuit.com/connect/oauth2",
9492
+ tokenUrl: "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer",
9493
+ scopes: ["com.intuit.quickbooks.accounting"],
9494
+ clientIdEnv: "QUICKBOOKS_OAUTH_CLIENT_ID",
9495
+ clientSecretEnv: "QUICKBOOKS_OAUTH_CLIENT_SECRET"
9496
+ },
9497
+ category: "commerce",
9498
+ defaultConsistencyModel: "authoritative",
9499
+ baseUrl: { metadataKey: "apiBaseUrl" },
9500
+ defaultHeaders: {
9501
+ accept: "application/json"
9502
+ },
9503
+ // `realmId` is pinned at connect time, not passed per call, so the health
9504
+ // check reads it from connection metadata. Written as `{realmId}` it resolved
9505
+ // against the (empty) test argument map and threw before any request was
9506
+ // made — the connection test could never pass, for any connection.
9507
+ test: { method: "GET", path: "companyinfo/{connection.realmId}", query: { minorversion: "70" } },
9508
+ capabilities: [
9509
+ {
9510
+ // The reports namespace is NOT reachable through `entities.query` — QBO
9511
+ // exposes the accountant-grade statements only under /reports/{name}.
9512
+ // These four are the tax/bookkeeping read surface; without them a tax
9513
+ // agent can enumerate ledger rows but cannot obtain a P&L or a balance
9514
+ // sheet, which is what a return is actually built from.
9515
+ name: "reports.get",
9516
+ class: "read",
9517
+ description: "Run a QuickBooks Online report. `reportName` is the QBO report id (ProfitAndLoss, BalanceSheet, TrialBalance, GeneralLedger, CashFlow, AgedReceivables, AgedPayables).",
9518
+ parameters: {
9519
+ type: "object",
9520
+ properties: {
9521
+ reportName: {
9522
+ type: "string",
9523
+ enum: [
9524
+ "ProfitAndLoss",
9525
+ "BalanceSheet",
9526
+ "TrialBalance",
9527
+ "GeneralLedger",
9528
+ "CashFlow",
9529
+ "AgedReceivables",
9530
+ "AgedPayables"
9531
+ ]
9532
+ },
9533
+ start_date: { type: "string", description: "YYYY-MM-DD (inclusive)." },
9534
+ end_date: { type: "string", description: "YYYY-MM-DD (inclusive)." },
9535
+ accounting_method: { type: "string", enum: ["Cash", "Accrual"] },
9536
+ date_macro: { type: "string", description: 'e.g. "Last Fiscal Year" \u2014 alternative to start/end dates.' },
9537
+ summarize_column_by: { type: "string", description: "e.g. Month, Quarter, Year, Total." },
9538
+ minorversion: { type: "string" }
9539
+ },
9540
+ required: ["reportName"]
9541
+ },
9542
+ request: {
9543
+ method: "GET",
9544
+ path: "reports/{reportName}",
9545
+ query: {
9546
+ start_date: "{start_date}",
9547
+ end_date: "{end_date}",
9548
+ accounting_method: "{accounting_method}",
9549
+ date_macro: "{date_macro}",
9550
+ summarize_column_by: "{summarize_column_by}",
9551
+ minorversion: "{minorversion}"
9552
+ }
9553
+ },
9554
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9555
+ },
9556
+ {
9557
+ name: "companyinfo.get",
9558
+ class: "read",
9559
+ description: "Read the connected QuickBooks company profile (legal name, EIN/company id, fiscal year start, country) for the realm this connection was authorized against.",
9560
+ parameters: { type: "object", properties: { minorversion: { type: "string" } } },
9561
+ request: {
9562
+ method: "GET",
9563
+ path: "companyinfo/{connection.realmId}",
9564
+ query: { minorversion: "{minorversion}" }
9565
+ },
9566
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9567
+ },
9568
+ {
9569
+ name: "entities.query",
9570
+ class: "read",
9571
+ description: 'Run a QuickBooks Online query (e.g. "SELECT * FROM Customer WHERE Active = true MAXRESULTS 50").',
9572
+ parameters: {
9573
+ type: "object",
9574
+ properties: {
9575
+ query: { type: "string" },
9576
+ minorversion: { type: "string" }
9577
+ },
9578
+ required: ["query"]
9579
+ },
9580
+ request: {
9581
+ method: "GET",
9582
+ path: "query",
9583
+ query: { query: "{query}", minorversion: "{minorversion}" }
9584
+ },
9585
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9586
+ },
9587
+ {
9588
+ name: "customers.get",
9589
+ class: "read",
9590
+ description: "Read a QuickBooks customer by id.",
9591
+ parameters: {
9592
+ type: "object",
9593
+ properties: {
9594
+ customerId: { type: "string" },
9595
+ minorversion: { type: "string" }
9596
+ },
9597
+ required: ["customerId"]
9598
+ },
9599
+ request: {
9600
+ method: "GET",
9601
+ path: "customer/{customerId}",
9602
+ query: { minorversion: "{minorversion}" }
9603
+ },
9604
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9605
+ },
9606
+ {
9607
+ name: "customers.create",
9608
+ class: "mutation",
9609
+ description: "Create a QuickBooks customer.",
9610
+ parameters: {
9611
+ type: "object",
9612
+ properties: {
9613
+ DisplayName: { type: "string" },
9614
+ GivenName: { type: "string" },
9615
+ FamilyName: { type: "string" },
9616
+ CompanyName: { type: "string" },
9617
+ PrimaryEmailAddr: { type: "object" },
9618
+ PrimaryPhone: { type: "object" },
9619
+ BillAddr: { type: "object" },
9620
+ Notes: { type: "string" }
9621
+ },
9622
+ required: ["DisplayName"]
9623
+ },
9624
+ request: {
9625
+ method: "POST",
9626
+ path: "customer",
9627
+ query: { minorversion: "70" },
9628
+ body: "args"
9629
+ },
9630
+ cas: "native-idempotency",
9631
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9632
+ },
9633
+ {
9634
+ name: "customers.update",
9635
+ class: "mutation",
9636
+ description: "Sparse-update a QuickBooks customer. Caller must include Id and SyncToken from the prior read.",
9637
+ parameters: {
9638
+ type: "object",
9639
+ properties: {
9640
+ Id: { type: "string" },
9641
+ SyncToken: { type: "string" },
9642
+ sparse: { type: "boolean", default: true },
9643
+ DisplayName: { type: "string" },
9644
+ GivenName: { type: "string" },
9645
+ FamilyName: { type: "string" },
9646
+ CompanyName: { type: "string" },
9647
+ PrimaryEmailAddr: { type: "object" },
9648
+ PrimaryPhone: { type: "object" },
9649
+ BillAddr: { type: "object" },
9650
+ Notes: { type: "string" },
9651
+ Active: { type: "boolean" }
9652
+ },
9653
+ required: ["Id", "SyncToken"]
9654
+ },
9655
+ request: {
9656
+ method: "POST",
9657
+ path: "customer",
9658
+ query: { minorversion: "70" },
9659
+ body: "args"
9660
+ },
9661
+ cas: "optimistic-read-verify",
9662
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9663
+ },
9664
+ {
9665
+ name: "invoices.get",
9666
+ class: "read",
9667
+ description: "Read a QuickBooks invoice by id.",
9668
+ parameters: {
9669
+ type: "object",
9670
+ properties: {
9671
+ invoiceId: { type: "string" },
9672
+ minorversion: { type: "string" }
9673
+ },
9674
+ required: ["invoiceId"]
9675
+ },
9676
+ request: {
9677
+ method: "GET",
9678
+ path: "invoice/{invoiceId}",
9679
+ query: { minorversion: "{minorversion}" }
9680
+ },
9681
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9682
+ },
9683
+ {
9684
+ name: "invoices.create",
9685
+ class: "mutation",
9686
+ description: "Create a QuickBooks invoice. `Line` and `CustomerRef` are required by the API.",
9687
+ parameters: {
9688
+ type: "object",
9689
+ properties: {
9690
+ CustomerRef: { type: "object" },
9691
+ Line: { type: "array", items: { type: "object" } },
9692
+ TxnDate: { type: "string" },
9693
+ DueDate: { type: "string" },
9694
+ CurrencyRef: { type: "object" },
9695
+ BillEmail: { type: "object" },
9696
+ PrivateNote: { type: "string" },
9697
+ CustomerMemo: { type: "object" }
9698
+ },
9699
+ required: ["CustomerRef", "Line"]
9700
+ },
9701
+ request: {
9702
+ method: "POST",
9703
+ path: "invoice",
9704
+ query: { minorversion: "70" },
9705
+ body: "args"
9706
+ },
9707
+ cas: "native-idempotency",
9708
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9709
+ },
9710
+ {
9711
+ name: "invoices.update",
9712
+ class: "mutation",
9713
+ description: "Sparse-update a QuickBooks invoice. Caller must include Id and SyncToken from the prior read.",
9714
+ parameters: {
9715
+ type: "object",
9716
+ properties: {
9717
+ Id: { type: "string" },
9718
+ SyncToken: { type: "string" },
9719
+ sparse: { type: "boolean", default: true },
9720
+ CustomerRef: { type: "object" },
9721
+ Line: { type: "array", items: { type: "object" } },
9722
+ DueDate: { type: "string" },
9723
+ CustomerMemo: { type: "object" },
9724
+ PrivateNote: { type: "string" }
9725
+ },
9726
+ required: ["Id", "SyncToken"]
9727
+ },
9728
+ request: {
9729
+ method: "POST",
9730
+ path: "invoice",
9731
+ query: { minorversion: "70" },
9732
+ body: "args"
9733
+ },
9734
+ cas: "optimistic-read-verify",
9735
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9736
+ },
9737
+ {
9738
+ name: "items.create",
9739
+ class: "mutation",
9740
+ description: "Create a QuickBooks item (product or service).",
9741
+ parameters: {
9742
+ type: "object",
9743
+ properties: {
9744
+ Name: { type: "string" },
9745
+ Type: { type: "string", enum: ["Service", "Inventory", "NonInventory"] },
9746
+ IncomeAccountRef: { type: "object" },
9747
+ ExpenseAccountRef: { type: "object" },
9748
+ UnitPrice: { type: "number" },
9749
+ Description: { type: "string" },
9750
+ Taxable: { type: "boolean" }
9751
+ },
9752
+ required: ["Name", "Type", "IncomeAccountRef"]
9753
+ },
9754
+ request: {
9755
+ method: "POST",
9756
+ path: "item",
9757
+ query: { minorversion: "70" },
9758
+ body: "args"
9759
+ },
9760
+ cas: "native-idempotency",
9761
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9762
+ },
9763
+ {
9764
+ name: "customers.delete",
9765
+ class: "mutation",
9766
+ description: "Mark a QuickBooks customer inactive. QBO does not support hard deletes \u2014 caller must supply Id and SyncToken from the prior read.",
9767
+ parameters: {
9768
+ type: "object",
9769
+ properties: {
9770
+ Id: { type: "string" },
9771
+ SyncToken: { type: "string" },
9772
+ sparse: { type: "boolean", default: true },
9773
+ Active: { type: "boolean", default: false }
9774
+ },
9775
+ required: ["Id", "SyncToken"]
9776
+ },
9777
+ request: {
9778
+ method: "POST",
9779
+ path: "customer",
9780
+ query: { minorversion: "70" },
9781
+ body: "args"
9782
+ },
9783
+ cas: "native-idempotency",
9784
+ externalEffect: true,
9785
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9786
+ },
9787
+ {
9788
+ name: "invoices.delete",
9789
+ class: "mutation",
9790
+ description: "Void a QuickBooks invoice (QBO does not hard-delete invoices). Caller must supply Id and SyncToken.",
9791
+ parameters: {
9792
+ type: "object",
9793
+ properties: {
9794
+ Id: { type: "string" },
9795
+ SyncToken: { type: "string" }
9796
+ },
9797
+ required: ["Id", "SyncToken"]
9798
+ },
9799
+ request: {
9800
+ method: "POST",
9801
+ path: "invoice",
9802
+ query: { operation: "void", minorversion: "70" },
9803
+ body: "args"
9804
+ },
9805
+ cas: "native-idempotency",
9806
+ externalEffect: true,
9807
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9808
+ },
9809
+ {
9810
+ name: "invoices.send",
9811
+ class: "mutation",
9812
+ description: "Email a QuickBooks invoice to the customer (optionally override the recipient with `sendTo`).",
9813
+ parameters: {
9814
+ type: "object",
9815
+ properties: {
9816
+ invoiceId: { type: "string" },
9817
+ sendTo: { type: "string" }
9818
+ },
9819
+ required: ["invoiceId"]
9820
+ },
9821
+ request: {
9822
+ method: "POST",
9823
+ path: "invoice/{invoiceId}/send",
9824
+ query: { sendTo: "{sendTo}", minorversion: "70" }
9825
+ },
9826
+ cas: "native-idempotency",
9827
+ externalEffect: true,
9828
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9829
+ },
9830
+ {
9831
+ name: "bills.create",
9832
+ class: "mutation",
9833
+ description: "Create a QuickBooks vendor bill. `VendorRef` and `Line` are required by the API.",
9834
+ parameters: {
9835
+ type: "object",
9836
+ properties: {
9837
+ VendorRef: { type: "object" },
9838
+ Line: { type: "array", items: { type: "object" } },
9839
+ TxnDate: { type: "string" },
9840
+ DueDate: { type: "string" },
9841
+ CurrencyRef: { type: "object" },
9842
+ PrivateNote: { type: "string" },
9843
+ APAccountRef: { type: "object" }
9844
+ },
9845
+ required: ["VendorRef", "Line"]
9846
+ },
9847
+ request: {
9848
+ method: "POST",
9849
+ path: "bill",
9850
+ query: { minorversion: "70" },
9851
+ body: "args"
9852
+ },
9853
+ cas: "native-idempotency",
9854
+ externalEffect: true,
9855
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9856
+ },
9857
+ {
9858
+ name: "vendors.create",
9859
+ class: "mutation",
9860
+ description: "Create a QuickBooks vendor.",
9861
+ parameters: {
9862
+ type: "object",
9863
+ properties: {
9864
+ DisplayName: { type: "string" },
9865
+ GivenName: { type: "string" },
9866
+ FamilyName: { type: "string" },
9867
+ CompanyName: { type: "string" },
9868
+ PrimaryEmailAddr: { type: "object" },
9869
+ PrimaryPhone: { type: "object" },
9870
+ BillAddr: { type: "object" },
9871
+ TaxIdentifier: { type: "string" },
9872
+ AcctNum: { type: "string" }
9873
+ },
9874
+ required: ["DisplayName"]
9875
+ },
9876
+ request: {
9877
+ method: "POST",
9878
+ path: "vendor",
9879
+ query: { minorversion: "70" },
9880
+ body: "args"
9881
+ },
9882
+ cas: "native-idempotency",
9883
+ externalEffect: true,
9884
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9885
+ },
9886
+ {
9887
+ name: "payments.create",
9888
+ class: "mutation",
9889
+ description: "Record a QuickBooks payment against a customer (and optionally apply to invoices via `Line[].LinkedTxn`).",
9890
+ parameters: {
9891
+ type: "object",
9892
+ properties: {
9893
+ CustomerRef: { type: "object" },
9894
+ TotalAmt: { type: "number" },
9895
+ TxnDate: { type: "string" },
9896
+ PaymentMethodRef: { type: "object" },
9897
+ DepositToAccountRef: { type: "object" },
9898
+ Line: { type: "array", items: { type: "object" } },
9899
+ PrivateNote: { type: "string" }
9900
+ },
9901
+ required: ["CustomerRef", "TotalAmt"]
9902
+ },
9903
+ request: {
9904
+ method: "POST",
9905
+ path: "payment",
9906
+ query: { minorversion: "70" },
9907
+ body: "args"
9908
+ },
9909
+ cas: "native-idempotency",
9910
+ requiredScopes: ["com.intuit.quickbooks.accounting"]
9911
+ }
9912
+ ]
9913
+ });
9914
+
9484
9915
  // src/connectors/adapters/sharepoint.ts
9485
9916
  var SCOPES11 = [
9486
9917
  "https://graph.microsoft.com/Sites.ReadWrite.All",
@@ -12116,6 +12547,421 @@ async function deleteTemplate(inv, accessToken) {
12116
12547
  };
12117
12548
  }
12118
12549
 
12550
+ // src/connectors/adapters/xero.ts
12551
+ var xeroConnector = declarativeRestConnector({
12552
+ kind: "xero",
12553
+ displayName: "Xero",
12554
+ description: "Search and update Xero contacts, invoices, and chart-of-account records across authorized organizations.",
12555
+ auth: {
12556
+ kind: "oauth2",
12557
+ authorizationUrl: "https://login.xero.com/identity/connect/authorize",
12558
+ tokenUrl: "https://identity.xero.com/connect/token",
12559
+ // `accounting.reports.read` is a distinct Xero scope — the reports
12560
+ // namespace is not covered by settings/transactions and 403s without it.
12561
+ scopes: [
12562
+ "offline_access",
12563
+ "accounting.contacts",
12564
+ "accounting.transactions",
12565
+ "accounting.settings.read",
12566
+ "accounting.reports.read"
12567
+ ],
12568
+ clientIdEnv: "XERO_OAUTH_CLIENT_ID",
12569
+ clientSecretEnv: "XERO_OAUTH_CLIENT_SECRET"
12570
+ },
12571
+ category: "crm",
12572
+ defaultConsistencyModel: "authoritative",
12573
+ baseUrl: "https://api.xero.com",
12574
+ defaultHeaders: { accept: "application/json" },
12575
+ test: { method: "GET", path: "/connections" },
12576
+ capabilities: [
12577
+ {
12578
+ // Every other Xero capability REQUIRES `tenantId`, and a tenant id is an
12579
+ // opaque GUID no caller can know before asking. Without this read the
12580
+ // connector is unusable by an agent: the only place the id appeared was
12581
+ // the health check, which discards its body.
12582
+ name: "tenants.list",
12583
+ class: "read",
12584
+ description: "List the Xero organizations (tenants) this connection is authorized for. Call this FIRST \u2014 every other Xero capability requires the `tenantId` returned here.",
12585
+ parameters: { type: "object", properties: {} },
12586
+ request: { method: "GET", path: "/connections" }
12587
+ },
12588
+ {
12589
+ // Xero's reporting surface, like QBO's, is a separate namespace from the
12590
+ // record endpoints. These are the statements a return or a books review
12591
+ // is actually built from.
12592
+ name: "reports.get",
12593
+ class: "read",
12594
+ description: "Run a Xero accounting report. `reportName` is the Xero report id (ProfitAndLoss, BalanceSheet, TrialBalance, BankSummary, AgedReceivablesByContact, AgedPayablesByContact).",
12595
+ parameters: {
12596
+ type: "object",
12597
+ properties: {
12598
+ tenantId: { type: "string", description: "From tenants.list." },
12599
+ reportName: {
12600
+ type: "string",
12601
+ enum: [
12602
+ "ProfitAndLoss",
12603
+ "BalanceSheet",
12604
+ "TrialBalance",
12605
+ "BankSummary",
12606
+ "AgedReceivablesByContact",
12607
+ "AgedPayablesByContact"
12608
+ ]
12609
+ },
12610
+ fromDate: { type: "string", description: "YYYY-MM-DD." },
12611
+ toDate: { type: "string", description: "YYYY-MM-DD." },
12612
+ date: { type: "string", description: "YYYY-MM-DD \u2014 point-in-time reports (BalanceSheet, TrialBalance)." },
12613
+ contactId: { type: "string", description: "Required by the aged receivables/payables reports." }
12614
+ },
12615
+ required: ["tenantId", "reportName"]
12616
+ },
12617
+ request: {
12618
+ method: "GET",
12619
+ path: "/api.xro/2.0/Reports/{reportName}",
12620
+ query: { fromDate: "{fromDate}", toDate: "{toDate}", date: "{date}", contactID: "{contactId}" },
12621
+ headers: { "xero-tenant-id": "{tenantId}" }
12622
+ },
12623
+ requiredScopes: ["accounting.reports.read"]
12624
+ },
12625
+ {
12626
+ name: "contacts.search",
12627
+ class: "read",
12628
+ description: "Search Xero contacts in a tenant using the Xero where-clause query language.",
12629
+ parameters: {
12630
+ type: "object",
12631
+ properties: {
12632
+ tenantId: { type: "string", description: "Xero tenant (organization) id from /connections." },
12633
+ where: { type: "string", description: `Xero where clause, e.g. 'Name.Contains("Acme")'.` },
12634
+ order: { type: "string", description: 'Sort expression, e.g. "Name ASC".' },
12635
+ page: { type: "integer", minimum: 1 }
12636
+ },
12637
+ required: ["tenantId"]
12638
+ },
12639
+ request: {
12640
+ method: "GET",
12641
+ path: "/api.xro/2.0/Contacts",
12642
+ query: { where: "{where}", order: "{order}", page: "{page}" },
12643
+ headers: { "xero-tenant-id": "{tenantId}" }
12644
+ },
12645
+ requiredScopes: ["accounting.contacts"]
12646
+ },
12647
+ {
12648
+ name: "contacts.get",
12649
+ class: "read",
12650
+ description: "Read a single Xero contact by ContactID.",
12651
+ parameters: {
12652
+ type: "object",
12653
+ properties: {
12654
+ tenantId: { type: "string" },
12655
+ contactId: { type: "string", description: "Xero ContactID (GUID)." }
12656
+ },
12657
+ required: ["tenantId", "contactId"]
12658
+ },
12659
+ request: {
12660
+ method: "GET",
12661
+ path: "/api.xro/2.0/Contacts/{contactId}",
12662
+ headers: { "xero-tenant-id": "{tenantId}" }
12663
+ },
12664
+ requiredScopes: ["accounting.contacts"]
12665
+ },
12666
+ {
12667
+ name: "contacts.create",
12668
+ class: "mutation",
12669
+ description: "Create a Xero contact. Pass a Contacts array per the Xero API contract.",
12670
+ parameters: {
12671
+ type: "object",
12672
+ properties: {
12673
+ tenantId: { type: "string" },
12674
+ Contacts: {
12675
+ type: "array",
12676
+ items: {
12677
+ type: "object",
12678
+ properties: {
12679
+ Name: { type: "string" },
12680
+ EmailAddress: { type: "string" },
12681
+ FirstName: { type: "string" },
12682
+ LastName: { type: "string" }
12683
+ },
12684
+ required: ["Name"]
12685
+ }
12686
+ }
12687
+ },
12688
+ required: ["tenantId", "Contacts"]
12689
+ },
12690
+ request: {
12691
+ method: "POST",
12692
+ path: "/api.xro/2.0/Contacts",
12693
+ body: { Contacts: "{Contacts}" },
12694
+ headers: { "xero-tenant-id": "{tenantId}" }
12695
+ },
12696
+ cas: "native-idempotency",
12697
+ requiredScopes: ["accounting.contacts"]
12698
+ },
12699
+ {
12700
+ name: "contacts.update",
12701
+ class: "mutation",
12702
+ description: "Update a Xero contact by ContactID.",
12703
+ parameters: {
12704
+ type: "object",
12705
+ properties: {
12706
+ tenantId: { type: "string" },
12707
+ contactId: { type: "string" },
12708
+ fields: { type: "object", description: "Partial Xero Contact payload." }
12709
+ },
12710
+ required: ["tenantId", "contactId", "fields"]
12711
+ },
12712
+ request: {
12713
+ method: "POST",
12714
+ path: "/api.xro/2.0/Contacts/{contactId}",
12715
+ body: "{fields}",
12716
+ headers: { "xero-tenant-id": "{tenantId}" }
12717
+ },
12718
+ cas: "optimistic-read-verify",
12719
+ requiredScopes: ["accounting.contacts"]
12720
+ },
12721
+ {
12722
+ name: "invoices.search",
12723
+ class: "read",
12724
+ description: "Search Xero invoices in a tenant.",
12725
+ parameters: {
12726
+ type: "object",
12727
+ properties: {
12728
+ tenantId: { type: "string" },
12729
+ where: { type: "string", description: `Xero where clause, e.g. 'Status=="AUTHORISED"'.` },
12730
+ order: { type: "string", description: 'Sort expression, e.g. "Date DESC".' },
12731
+ page: { type: "integer", minimum: 1 }
12732
+ },
12733
+ required: ["tenantId"]
12734
+ },
12735
+ request: {
12736
+ method: "GET",
12737
+ path: "/api.xro/2.0/Invoices",
12738
+ query: { where: "{where}", order: "{order}", page: "{page}" },
12739
+ headers: { "xero-tenant-id": "{tenantId}" }
12740
+ },
12741
+ requiredScopes: ["accounting.transactions"]
12742
+ },
12743
+ {
12744
+ name: "invoices.get",
12745
+ class: "read",
12746
+ description: "Read a single Xero invoice by InvoiceID or InvoiceNumber.",
12747
+ parameters: {
12748
+ type: "object",
12749
+ properties: {
12750
+ tenantId: { type: "string" },
12751
+ invoiceId: { type: "string", description: "Xero InvoiceID (GUID) or InvoiceNumber." }
12752
+ },
12753
+ required: ["tenantId", "invoiceId"]
12754
+ },
12755
+ request: {
12756
+ method: "GET",
12757
+ path: "/api.xro/2.0/Invoices/{invoiceId}",
12758
+ headers: { "xero-tenant-id": "{tenantId}" }
12759
+ },
12760
+ requiredScopes: ["accounting.transactions"]
12761
+ },
12762
+ {
12763
+ name: "invoices.create",
12764
+ class: "mutation",
12765
+ description: "Create a Xero invoice (AR or AP). Pass an Invoices array per the Xero API contract.",
12766
+ parameters: {
12767
+ type: "object",
12768
+ properties: {
12769
+ tenantId: { type: "string" },
12770
+ Invoices: {
12771
+ type: "array",
12772
+ items: {
12773
+ type: "object",
12774
+ properties: {
12775
+ Type: { type: "string", enum: ["ACCREC", "ACCPAY"] },
12776
+ Contact: { type: "object" },
12777
+ LineItems: { type: "array", items: { type: "object" } },
12778
+ Date: { type: "string", description: "YYYY-MM-DD." },
12779
+ DueDate: { type: "string", description: "YYYY-MM-DD." },
12780
+ Reference: { type: "string" },
12781
+ Status: { type: "string", enum: ["DRAFT", "SUBMITTED", "AUTHORISED"] }
12782
+ },
12783
+ required: ["Type", "Contact", "LineItems"]
12784
+ }
12785
+ }
12786
+ },
12787
+ required: ["tenantId", "Invoices"]
12788
+ },
12789
+ request: {
12790
+ method: "POST",
12791
+ path: "/api.xro/2.0/Invoices",
12792
+ body: { Invoices: "{Invoices}" },
12793
+ headers: { "xero-tenant-id": "{tenantId}" }
12794
+ },
12795
+ cas: "native-idempotency",
12796
+ requiredScopes: ["accounting.transactions"]
12797
+ },
12798
+ {
12799
+ name: "accounts.search",
12800
+ class: "read",
12801
+ description: "List Xero chart-of-account records for a tenant.",
12802
+ parameters: {
12803
+ type: "object",
12804
+ properties: {
12805
+ tenantId: { type: "string" },
12806
+ where: { type: "string", description: `Xero where clause, e.g. 'Type=="REVENUE"'.` },
12807
+ order: { type: "string" }
12808
+ },
12809
+ required: ["tenantId"]
12810
+ },
12811
+ request: {
12812
+ method: "GET",
12813
+ path: "/api.xro/2.0/Accounts",
12814
+ query: { where: "{where}", order: "{order}" },
12815
+ headers: { "xero-tenant-id": "{tenantId}" }
12816
+ },
12817
+ requiredScopes: ["accounting.settings.read"]
12818
+ },
12819
+ {
12820
+ name: "contacts.archive",
12821
+ class: "mutation",
12822
+ description: "Archive a Xero contact (sets ContactStatus to ARCHIVED).",
12823
+ parameters: {
12824
+ type: "object",
12825
+ properties: {
12826
+ tenantId: { type: "string" },
12827
+ contactId: { type: "string", description: "Xero ContactID (GUID)." }
12828
+ },
12829
+ required: ["tenantId", "contactId"]
12830
+ },
12831
+ request: {
12832
+ method: "POST",
12833
+ path: "/api.xro/2.0/Contacts/{contactId}",
12834
+ body: { ContactStatus: "ARCHIVED" },
12835
+ headers: { "xero-tenant-id": "{tenantId}" }
12836
+ },
12837
+ cas: "native-idempotency",
12838
+ externalEffect: true,
12839
+ requiredScopes: ["accounting.contacts"]
12840
+ },
12841
+ {
12842
+ name: "invoices.delete",
12843
+ class: "mutation",
12844
+ description: "Void or delete a Xero invoice. DRAFT/SUBMITTED invoices accept DELETED, AUTHORISED invoices accept VOIDED.",
12845
+ parameters: {
12846
+ type: "object",
12847
+ properties: {
12848
+ tenantId: { type: "string" },
12849
+ invoiceId: { type: "string", description: "Xero InvoiceID (GUID) or InvoiceNumber." },
12850
+ status: {
12851
+ type: "string",
12852
+ enum: ["VOIDED", "DELETED"],
12853
+ description: "Target status. VOIDED for authorised invoices, DELETED for draft/submitted invoices."
12854
+ }
12855
+ },
12856
+ required: ["tenantId", "invoiceId", "status"]
12857
+ },
12858
+ request: {
12859
+ method: "POST",
12860
+ path: "/api.xro/2.0/Invoices/{invoiceId}",
12861
+ body: { Status: "{status}" },
12862
+ headers: { "xero-tenant-id": "{tenantId}" }
12863
+ },
12864
+ cas: "native-idempotency",
12865
+ externalEffect: true,
12866
+ requiredScopes: ["accounting.transactions"]
12867
+ },
12868
+ {
12869
+ name: "invoices.email",
12870
+ class: "mutation",
12871
+ description: "Email a Xero invoice to its contact using the saved template.",
12872
+ parameters: {
12873
+ type: "object",
12874
+ properties: {
12875
+ tenantId: { type: "string" },
12876
+ invoiceId: { type: "string", description: "Xero InvoiceID (GUID) or InvoiceNumber." }
12877
+ },
12878
+ required: ["tenantId", "invoiceId"]
12879
+ },
12880
+ request: {
12881
+ method: "POST",
12882
+ path: "/api.xro/2.0/Invoices/{invoiceId}/Email",
12883
+ body: {},
12884
+ headers: { "xero-tenant-id": "{tenantId}" }
12885
+ },
12886
+ cas: "native-idempotency",
12887
+ externalEffect: true,
12888
+ requiredScopes: ["accounting.transactions"]
12889
+ },
12890
+ {
12891
+ name: "payments.create",
12892
+ class: "mutation",
12893
+ description: "Apply a payment to a Xero invoice or credit note. Pass a Payments array per the Xero API contract.",
12894
+ parameters: {
12895
+ type: "object",
12896
+ properties: {
12897
+ tenantId: { type: "string" },
12898
+ Payments: {
12899
+ type: "array",
12900
+ items: {
12901
+ type: "object",
12902
+ properties: {
12903
+ Invoice: { type: "object", description: 'Invoice reference, e.g. { InvoiceID: "..." }.' },
12904
+ CreditNote: { type: "object", description: 'CreditNote reference, e.g. { CreditNoteID: "..." }.' },
12905
+ Account: { type: "object", description: 'Bank account reference, e.g. { Code: "090" }.' },
12906
+ Date: { type: "string", description: "YYYY-MM-DD." },
12907
+ Amount: { type: "number" },
12908
+ Reference: { type: "string" }
12909
+ },
12910
+ required: ["Account", "Date", "Amount"]
12911
+ }
12912
+ }
12913
+ },
12914
+ required: ["tenantId", "Payments"]
12915
+ },
12916
+ request: {
12917
+ method: "POST",
12918
+ path: "/api.xro/2.0/Payments",
12919
+ body: { Payments: "{Payments}" },
12920
+ headers: { "xero-tenant-id": "{tenantId}" }
12921
+ },
12922
+ cas: "native-idempotency",
12923
+ externalEffect: true,
12924
+ requiredScopes: ["accounting.transactions"]
12925
+ },
12926
+ {
12927
+ name: "credit-notes.create",
12928
+ class: "mutation",
12929
+ description: "Create a Xero credit note (ACCRECCREDIT or ACCPAYCREDIT). Pass a CreditNotes array per the Xero API contract.",
12930
+ parameters: {
12931
+ type: "object",
12932
+ properties: {
12933
+ tenantId: { type: "string" },
12934
+ CreditNotes: {
12935
+ type: "array",
12936
+ items: {
12937
+ type: "object",
12938
+ properties: {
12939
+ Type: { type: "string", enum: ["ACCRECCREDIT", "ACCPAYCREDIT"] },
12940
+ Contact: { type: "object" },
12941
+ LineItems: { type: "array", items: { type: "object" } },
12942
+ Date: { type: "string", description: "YYYY-MM-DD." },
12943
+ Reference: { type: "string" },
12944
+ Status: { type: "string", enum: ["DRAFT", "SUBMITTED", "AUTHORISED"] }
12945
+ },
12946
+ required: ["Type", "Contact", "LineItems"]
12947
+ }
12948
+ }
12949
+ },
12950
+ required: ["tenantId", "CreditNotes"]
12951
+ },
12952
+ request: {
12953
+ method: "POST",
12954
+ path: "/api.xro/2.0/CreditNotes",
12955
+ body: { CreditNotes: "{CreditNotes}" },
12956
+ headers: { "xero-tenant-id": "{tenantId}" }
12957
+ },
12958
+ cas: "native-idempotency",
12959
+ externalEffect: true,
12960
+ requiredScopes: ["accounting.transactions"]
12961
+ }
12962
+ ]
12963
+ });
12964
+
12119
12965
  // src/connectors/adapters/factories.ts
12120
12966
  function defineFactoryAdapter(factory, envMap) {
12121
12967
  const metadataOptions = Object.fromEntries(
@@ -12217,6 +13063,17 @@ var CONNECTOR_ADAPTER_FACTORIES = [
12217
13063
  defineFactoryAdapter(twitter, {
12218
13064
  clientId: "TWITTER_OAUTH_CLIENT_ID",
12219
13065
  clientSecret: "TWITTER_OAUTH_CLIENT_SECRET"
13066
+ }),
13067
+ // Declarative OAuth2 connectors: the manifest already pins clientIdEnv /
13068
+ // clientSecretEnv; the envMap re-pins the same names so registration is
13069
+ // gated on the OAuth app actually being configured (no half-live connector).
13070
+ defineFactoryAdapter(() => quickbooksConnector, {
13071
+ clientId: "QUICKBOOKS_OAUTH_CLIENT_ID",
13072
+ clientSecret: "QUICKBOOKS_OAUTH_CLIENT_SECRET"
13073
+ }),
13074
+ defineFactoryAdapter(() => xeroConnector, {
13075
+ clientId: "XERO_OAUTH_CLIENT_ID",
13076
+ clientSecret: "XERO_OAUTH_CLIENT_SECRET"
12220
13077
  })
12221
13078
  ];
12222
13079
  function resolveConnectorAdapterFactoryOptions(definition, envSource) {
@@ -19315,852 +20172,6 @@ var attioConnector = declarativeRestConnector({
19315
20172
  ]
19316
20173
  });
19317
20174
 
19318
- // src/connectors/adapters/quickbooks.ts
19319
- var quickbooksConnector = declarativeRestConnector({
19320
- kind: "quickbooks",
19321
- displayName: "QuickBooks",
19322
- description: "Query QuickBooks Online entities with SQL-like queries and create or update customers, invoices, and items.",
19323
- auth: {
19324
- kind: "oauth2",
19325
- authorizationUrl: "https://appcenter.intuit.com/connect/oauth2",
19326
- tokenUrl: "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer",
19327
- scopes: ["com.intuit.quickbooks.accounting"],
19328
- clientIdEnv: "QUICKBOOKS_OAUTH_CLIENT_ID",
19329
- clientSecretEnv: "QUICKBOOKS_OAUTH_CLIENT_SECRET"
19330
- },
19331
- category: "commerce",
19332
- defaultConsistencyModel: "authoritative",
19333
- baseUrl: { metadataKey: "apiBaseUrl" },
19334
- defaultHeaders: {
19335
- accept: "application/json"
19336
- },
19337
- // `realmId` is pinned at connect time, not passed per call, so the health
19338
- // check reads it from connection metadata. Written as `{realmId}` it resolved
19339
- // against the (empty) test argument map and threw before any request was
19340
- // made — the connection test could never pass, for any connection.
19341
- test: { method: "GET", path: "companyinfo/{connection.realmId}", query: { minorversion: "70" } },
19342
- capabilities: [
19343
- {
19344
- // The reports namespace is NOT reachable through `entities.query` — QBO
19345
- // exposes the accountant-grade statements only under /reports/{name}.
19346
- // These four are the tax/bookkeeping read surface; without them a tax
19347
- // agent can enumerate ledger rows but cannot obtain a P&L or a balance
19348
- // sheet, which is what a return is actually built from.
19349
- name: "reports.get",
19350
- class: "read",
19351
- description: "Run a QuickBooks Online report. `reportName` is the QBO report id (ProfitAndLoss, BalanceSheet, TrialBalance, GeneralLedger, CashFlow, AgedReceivables, AgedPayables).",
19352
- parameters: {
19353
- type: "object",
19354
- properties: {
19355
- reportName: {
19356
- type: "string",
19357
- enum: [
19358
- "ProfitAndLoss",
19359
- "BalanceSheet",
19360
- "TrialBalance",
19361
- "GeneralLedger",
19362
- "CashFlow",
19363
- "AgedReceivables",
19364
- "AgedPayables"
19365
- ]
19366
- },
19367
- start_date: { type: "string", description: "YYYY-MM-DD (inclusive)." },
19368
- end_date: { type: "string", description: "YYYY-MM-DD (inclusive)." },
19369
- accounting_method: { type: "string", enum: ["Cash", "Accrual"] },
19370
- date_macro: { type: "string", description: 'e.g. "Last Fiscal Year" \u2014 alternative to start/end dates.' },
19371
- summarize_column_by: { type: "string", description: "e.g. Month, Quarter, Year, Total." },
19372
- minorversion: { type: "string" }
19373
- },
19374
- required: ["reportName"]
19375
- },
19376
- request: {
19377
- method: "GET",
19378
- path: "reports/{reportName}",
19379
- query: {
19380
- start_date: "{start_date}",
19381
- end_date: "{end_date}",
19382
- accounting_method: "{accounting_method}",
19383
- date_macro: "{date_macro}",
19384
- summarize_column_by: "{summarize_column_by}",
19385
- minorversion: "{minorversion}"
19386
- }
19387
- },
19388
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19389
- },
19390
- {
19391
- name: "companyinfo.get",
19392
- class: "read",
19393
- description: "Read the connected QuickBooks company profile (legal name, EIN/company id, fiscal year start, country) for the realm this connection was authorized against.",
19394
- parameters: { type: "object", properties: { minorversion: { type: "string" } } },
19395
- request: {
19396
- method: "GET",
19397
- path: "companyinfo/{connection.realmId}",
19398
- query: { minorversion: "{minorversion}" }
19399
- },
19400
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19401
- },
19402
- {
19403
- name: "entities.query",
19404
- class: "read",
19405
- description: 'Run a QuickBooks Online query (e.g. "SELECT * FROM Customer WHERE Active = true MAXRESULTS 50").',
19406
- parameters: {
19407
- type: "object",
19408
- properties: {
19409
- query: { type: "string" },
19410
- minorversion: { type: "string" }
19411
- },
19412
- required: ["query"]
19413
- },
19414
- request: {
19415
- method: "GET",
19416
- path: "query",
19417
- query: { query: "{query}", minorversion: "{minorversion}" }
19418
- },
19419
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19420
- },
19421
- {
19422
- name: "customers.get",
19423
- class: "read",
19424
- description: "Read a QuickBooks customer by id.",
19425
- parameters: {
19426
- type: "object",
19427
- properties: {
19428
- customerId: { type: "string" },
19429
- minorversion: { type: "string" }
19430
- },
19431
- required: ["customerId"]
19432
- },
19433
- request: {
19434
- method: "GET",
19435
- path: "customer/{customerId}",
19436
- query: { minorversion: "{minorversion}" }
19437
- },
19438
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19439
- },
19440
- {
19441
- name: "customers.create",
19442
- class: "mutation",
19443
- description: "Create a QuickBooks customer.",
19444
- parameters: {
19445
- type: "object",
19446
- properties: {
19447
- DisplayName: { type: "string" },
19448
- GivenName: { type: "string" },
19449
- FamilyName: { type: "string" },
19450
- CompanyName: { type: "string" },
19451
- PrimaryEmailAddr: { type: "object" },
19452
- PrimaryPhone: { type: "object" },
19453
- BillAddr: { type: "object" },
19454
- Notes: { type: "string" }
19455
- },
19456
- required: ["DisplayName"]
19457
- },
19458
- request: {
19459
- method: "POST",
19460
- path: "customer",
19461
- query: { minorversion: "70" },
19462
- body: "args"
19463
- },
19464
- cas: "native-idempotency",
19465
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19466
- },
19467
- {
19468
- name: "customers.update",
19469
- class: "mutation",
19470
- description: "Sparse-update a QuickBooks customer. Caller must include Id and SyncToken from the prior read.",
19471
- parameters: {
19472
- type: "object",
19473
- properties: {
19474
- Id: { type: "string" },
19475
- SyncToken: { type: "string" },
19476
- sparse: { type: "boolean", default: true },
19477
- DisplayName: { type: "string" },
19478
- GivenName: { type: "string" },
19479
- FamilyName: { type: "string" },
19480
- CompanyName: { type: "string" },
19481
- PrimaryEmailAddr: { type: "object" },
19482
- PrimaryPhone: { type: "object" },
19483
- BillAddr: { type: "object" },
19484
- Notes: { type: "string" },
19485
- Active: { type: "boolean" }
19486
- },
19487
- required: ["Id", "SyncToken"]
19488
- },
19489
- request: {
19490
- method: "POST",
19491
- path: "customer",
19492
- query: { minorversion: "70" },
19493
- body: "args"
19494
- },
19495
- cas: "optimistic-read-verify",
19496
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19497
- },
19498
- {
19499
- name: "invoices.get",
19500
- class: "read",
19501
- description: "Read a QuickBooks invoice by id.",
19502
- parameters: {
19503
- type: "object",
19504
- properties: {
19505
- invoiceId: { type: "string" },
19506
- minorversion: { type: "string" }
19507
- },
19508
- required: ["invoiceId"]
19509
- },
19510
- request: {
19511
- method: "GET",
19512
- path: "invoice/{invoiceId}",
19513
- query: { minorversion: "{minorversion}" }
19514
- },
19515
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19516
- },
19517
- {
19518
- name: "invoices.create",
19519
- class: "mutation",
19520
- description: "Create a QuickBooks invoice. `Line` and `CustomerRef` are required by the API.",
19521
- parameters: {
19522
- type: "object",
19523
- properties: {
19524
- CustomerRef: { type: "object" },
19525
- Line: { type: "array", items: { type: "object" } },
19526
- TxnDate: { type: "string" },
19527
- DueDate: { type: "string" },
19528
- CurrencyRef: { type: "object" },
19529
- BillEmail: { type: "object" },
19530
- PrivateNote: { type: "string" },
19531
- CustomerMemo: { type: "object" }
19532
- },
19533
- required: ["CustomerRef", "Line"]
19534
- },
19535
- request: {
19536
- method: "POST",
19537
- path: "invoice",
19538
- query: { minorversion: "70" },
19539
- body: "args"
19540
- },
19541
- cas: "native-idempotency",
19542
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19543
- },
19544
- {
19545
- name: "invoices.update",
19546
- class: "mutation",
19547
- description: "Sparse-update a QuickBooks invoice. Caller must include Id and SyncToken from the prior read.",
19548
- parameters: {
19549
- type: "object",
19550
- properties: {
19551
- Id: { type: "string" },
19552
- SyncToken: { type: "string" },
19553
- sparse: { type: "boolean", default: true },
19554
- CustomerRef: { type: "object" },
19555
- Line: { type: "array", items: { type: "object" } },
19556
- DueDate: { type: "string" },
19557
- CustomerMemo: { type: "object" },
19558
- PrivateNote: { type: "string" }
19559
- },
19560
- required: ["Id", "SyncToken"]
19561
- },
19562
- request: {
19563
- method: "POST",
19564
- path: "invoice",
19565
- query: { minorversion: "70" },
19566
- body: "args"
19567
- },
19568
- cas: "optimistic-read-verify",
19569
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19570
- },
19571
- {
19572
- name: "items.create",
19573
- class: "mutation",
19574
- description: "Create a QuickBooks item (product or service).",
19575
- parameters: {
19576
- type: "object",
19577
- properties: {
19578
- Name: { type: "string" },
19579
- Type: { type: "string", enum: ["Service", "Inventory", "NonInventory"] },
19580
- IncomeAccountRef: { type: "object" },
19581
- ExpenseAccountRef: { type: "object" },
19582
- UnitPrice: { type: "number" },
19583
- Description: { type: "string" },
19584
- Taxable: { type: "boolean" }
19585
- },
19586
- required: ["Name", "Type", "IncomeAccountRef"]
19587
- },
19588
- request: {
19589
- method: "POST",
19590
- path: "item",
19591
- query: { minorversion: "70" },
19592
- body: "args"
19593
- },
19594
- cas: "native-idempotency",
19595
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19596
- },
19597
- {
19598
- name: "customers.delete",
19599
- class: "mutation",
19600
- description: "Mark a QuickBooks customer inactive. QBO does not support hard deletes \u2014 caller must supply Id and SyncToken from the prior read.",
19601
- parameters: {
19602
- type: "object",
19603
- properties: {
19604
- Id: { type: "string" },
19605
- SyncToken: { type: "string" },
19606
- sparse: { type: "boolean", default: true },
19607
- Active: { type: "boolean", default: false }
19608
- },
19609
- required: ["Id", "SyncToken"]
19610
- },
19611
- request: {
19612
- method: "POST",
19613
- path: "customer",
19614
- query: { minorversion: "70" },
19615
- body: "args"
19616
- },
19617
- cas: "native-idempotency",
19618
- externalEffect: true,
19619
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19620
- },
19621
- {
19622
- name: "invoices.delete",
19623
- class: "mutation",
19624
- description: "Void a QuickBooks invoice (QBO does not hard-delete invoices). Caller must supply Id and SyncToken.",
19625
- parameters: {
19626
- type: "object",
19627
- properties: {
19628
- Id: { type: "string" },
19629
- SyncToken: { type: "string" }
19630
- },
19631
- required: ["Id", "SyncToken"]
19632
- },
19633
- request: {
19634
- method: "POST",
19635
- path: "invoice",
19636
- query: { operation: "void", minorversion: "70" },
19637
- body: "args"
19638
- },
19639
- cas: "native-idempotency",
19640
- externalEffect: true,
19641
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19642
- },
19643
- {
19644
- name: "invoices.send",
19645
- class: "mutation",
19646
- description: "Email a QuickBooks invoice to the customer (optionally override the recipient with `sendTo`).",
19647
- parameters: {
19648
- type: "object",
19649
- properties: {
19650
- invoiceId: { type: "string" },
19651
- sendTo: { type: "string" }
19652
- },
19653
- required: ["invoiceId"]
19654
- },
19655
- request: {
19656
- method: "POST",
19657
- path: "invoice/{invoiceId}/send",
19658
- query: { sendTo: "{sendTo}", minorversion: "70" }
19659
- },
19660
- cas: "native-idempotency",
19661
- externalEffect: true,
19662
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19663
- },
19664
- {
19665
- name: "bills.create",
19666
- class: "mutation",
19667
- description: "Create a QuickBooks vendor bill. `VendorRef` and `Line` are required by the API.",
19668
- parameters: {
19669
- type: "object",
19670
- properties: {
19671
- VendorRef: { type: "object" },
19672
- Line: { type: "array", items: { type: "object" } },
19673
- TxnDate: { type: "string" },
19674
- DueDate: { type: "string" },
19675
- CurrencyRef: { type: "object" },
19676
- PrivateNote: { type: "string" },
19677
- APAccountRef: { type: "object" }
19678
- },
19679
- required: ["VendorRef", "Line"]
19680
- },
19681
- request: {
19682
- method: "POST",
19683
- path: "bill",
19684
- query: { minorversion: "70" },
19685
- body: "args"
19686
- },
19687
- cas: "native-idempotency",
19688
- externalEffect: true,
19689
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19690
- },
19691
- {
19692
- name: "vendors.create",
19693
- class: "mutation",
19694
- description: "Create a QuickBooks vendor.",
19695
- parameters: {
19696
- type: "object",
19697
- properties: {
19698
- DisplayName: { type: "string" },
19699
- GivenName: { type: "string" },
19700
- FamilyName: { type: "string" },
19701
- CompanyName: { type: "string" },
19702
- PrimaryEmailAddr: { type: "object" },
19703
- PrimaryPhone: { type: "object" },
19704
- BillAddr: { type: "object" },
19705
- TaxIdentifier: { type: "string" },
19706
- AcctNum: { type: "string" }
19707
- },
19708
- required: ["DisplayName"]
19709
- },
19710
- request: {
19711
- method: "POST",
19712
- path: "vendor",
19713
- query: { minorversion: "70" },
19714
- body: "args"
19715
- },
19716
- cas: "native-idempotency",
19717
- externalEffect: true,
19718
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19719
- },
19720
- {
19721
- name: "payments.create",
19722
- class: "mutation",
19723
- description: "Record a QuickBooks payment against a customer (and optionally apply to invoices via `Line[].LinkedTxn`).",
19724
- parameters: {
19725
- type: "object",
19726
- properties: {
19727
- CustomerRef: { type: "object" },
19728
- TotalAmt: { type: "number" },
19729
- TxnDate: { type: "string" },
19730
- PaymentMethodRef: { type: "object" },
19731
- DepositToAccountRef: { type: "object" },
19732
- Line: { type: "array", items: { type: "object" } },
19733
- PrivateNote: { type: "string" }
19734
- },
19735
- required: ["CustomerRef", "TotalAmt"]
19736
- },
19737
- request: {
19738
- method: "POST",
19739
- path: "payment",
19740
- query: { minorversion: "70" },
19741
- body: "args"
19742
- },
19743
- cas: "native-idempotency",
19744
- requiredScopes: ["com.intuit.quickbooks.accounting"]
19745
- }
19746
- ]
19747
- });
19748
-
19749
- // src/connectors/adapters/xero.ts
19750
- var xeroConnector = declarativeRestConnector({
19751
- kind: "xero",
19752
- displayName: "Xero",
19753
- description: "Search and update Xero contacts, invoices, and chart-of-account records across authorized organizations.",
19754
- auth: {
19755
- kind: "oauth2",
19756
- authorizationUrl: "https://login.xero.com/identity/connect/authorize",
19757
- tokenUrl: "https://identity.xero.com/connect/token",
19758
- // `accounting.reports.read` is a distinct Xero scope — the reports
19759
- // namespace is not covered by settings/transactions and 403s without it.
19760
- scopes: [
19761
- "offline_access",
19762
- "accounting.contacts",
19763
- "accounting.transactions",
19764
- "accounting.settings.read",
19765
- "accounting.reports.read"
19766
- ],
19767
- clientIdEnv: "XERO_OAUTH_CLIENT_ID",
19768
- clientSecretEnv: "XERO_OAUTH_CLIENT_SECRET"
19769
- },
19770
- category: "crm",
19771
- defaultConsistencyModel: "authoritative",
19772
- baseUrl: "https://api.xero.com",
19773
- defaultHeaders: { accept: "application/json" },
19774
- test: { method: "GET", path: "/connections" },
19775
- capabilities: [
19776
- {
19777
- // Every other Xero capability REQUIRES `tenantId`, and a tenant id is an
19778
- // opaque GUID no caller can know before asking. Without this read the
19779
- // connector is unusable by an agent: the only place the id appeared was
19780
- // the health check, which discards its body.
19781
- name: "tenants.list",
19782
- class: "read",
19783
- description: "List the Xero organizations (tenants) this connection is authorized for. Call this FIRST \u2014 every other Xero capability requires the `tenantId` returned here.",
19784
- parameters: { type: "object", properties: {} },
19785
- request: { method: "GET", path: "/connections" }
19786
- },
19787
- {
19788
- // Xero's reporting surface, like QBO's, is a separate namespace from the
19789
- // record endpoints. These are the statements a return or a books review
19790
- // is actually built from.
19791
- name: "reports.get",
19792
- class: "read",
19793
- description: "Run a Xero accounting report. `reportName` is the Xero report id (ProfitAndLoss, BalanceSheet, TrialBalance, BankSummary, AgedReceivablesByContact, AgedPayablesByContact).",
19794
- parameters: {
19795
- type: "object",
19796
- properties: {
19797
- tenantId: { type: "string", description: "From tenants.list." },
19798
- reportName: {
19799
- type: "string",
19800
- enum: [
19801
- "ProfitAndLoss",
19802
- "BalanceSheet",
19803
- "TrialBalance",
19804
- "BankSummary",
19805
- "AgedReceivablesByContact",
19806
- "AgedPayablesByContact"
19807
- ]
19808
- },
19809
- fromDate: { type: "string", description: "YYYY-MM-DD." },
19810
- toDate: { type: "string", description: "YYYY-MM-DD." },
19811
- date: { type: "string", description: "YYYY-MM-DD \u2014 point-in-time reports (BalanceSheet, TrialBalance)." },
19812
- contactId: { type: "string", description: "Required by the aged receivables/payables reports." }
19813
- },
19814
- required: ["tenantId", "reportName"]
19815
- },
19816
- request: {
19817
- method: "GET",
19818
- path: "/api.xro/2.0/Reports/{reportName}",
19819
- query: { fromDate: "{fromDate}", toDate: "{toDate}", date: "{date}", contactID: "{contactId}" },
19820
- headers: { "xero-tenant-id": "{tenantId}" }
19821
- },
19822
- requiredScopes: ["accounting.reports.read"]
19823
- },
19824
- {
19825
- name: "contacts.search",
19826
- class: "read",
19827
- description: "Search Xero contacts in a tenant using the Xero where-clause query language.",
19828
- parameters: {
19829
- type: "object",
19830
- properties: {
19831
- tenantId: { type: "string", description: "Xero tenant (organization) id from /connections." },
19832
- where: { type: "string", description: `Xero where clause, e.g. 'Name.Contains("Acme")'.` },
19833
- order: { type: "string", description: 'Sort expression, e.g. "Name ASC".' },
19834
- page: { type: "integer", minimum: 1 }
19835
- },
19836
- required: ["tenantId"]
19837
- },
19838
- request: {
19839
- method: "GET",
19840
- path: "/api.xro/2.0/Contacts",
19841
- query: { where: "{where}", order: "{order}", page: "{page}" },
19842
- headers: { "xero-tenant-id": "{tenantId}" }
19843
- },
19844
- requiredScopes: ["accounting.contacts"]
19845
- },
19846
- {
19847
- name: "contacts.get",
19848
- class: "read",
19849
- description: "Read a single Xero contact by ContactID.",
19850
- parameters: {
19851
- type: "object",
19852
- properties: {
19853
- tenantId: { type: "string" },
19854
- contactId: { type: "string", description: "Xero ContactID (GUID)." }
19855
- },
19856
- required: ["tenantId", "contactId"]
19857
- },
19858
- request: {
19859
- method: "GET",
19860
- path: "/api.xro/2.0/Contacts/{contactId}",
19861
- headers: { "xero-tenant-id": "{tenantId}" }
19862
- },
19863
- requiredScopes: ["accounting.contacts"]
19864
- },
19865
- {
19866
- name: "contacts.create",
19867
- class: "mutation",
19868
- description: "Create a Xero contact. Pass a Contacts array per the Xero API contract.",
19869
- parameters: {
19870
- type: "object",
19871
- properties: {
19872
- tenantId: { type: "string" },
19873
- Contacts: {
19874
- type: "array",
19875
- items: {
19876
- type: "object",
19877
- properties: {
19878
- Name: { type: "string" },
19879
- EmailAddress: { type: "string" },
19880
- FirstName: { type: "string" },
19881
- LastName: { type: "string" }
19882
- },
19883
- required: ["Name"]
19884
- }
19885
- }
19886
- },
19887
- required: ["tenantId", "Contacts"]
19888
- },
19889
- request: {
19890
- method: "POST",
19891
- path: "/api.xro/2.0/Contacts",
19892
- body: { Contacts: "{Contacts}" },
19893
- headers: { "xero-tenant-id": "{tenantId}" }
19894
- },
19895
- cas: "native-idempotency",
19896
- requiredScopes: ["accounting.contacts"]
19897
- },
19898
- {
19899
- name: "contacts.update",
19900
- class: "mutation",
19901
- description: "Update a Xero contact by ContactID.",
19902
- parameters: {
19903
- type: "object",
19904
- properties: {
19905
- tenantId: { type: "string" },
19906
- contactId: { type: "string" },
19907
- fields: { type: "object", description: "Partial Xero Contact payload." }
19908
- },
19909
- required: ["tenantId", "contactId", "fields"]
19910
- },
19911
- request: {
19912
- method: "POST",
19913
- path: "/api.xro/2.0/Contacts/{contactId}",
19914
- body: "{fields}",
19915
- headers: { "xero-tenant-id": "{tenantId}" }
19916
- },
19917
- cas: "optimistic-read-verify",
19918
- requiredScopes: ["accounting.contacts"]
19919
- },
19920
- {
19921
- name: "invoices.search",
19922
- class: "read",
19923
- description: "Search Xero invoices in a tenant.",
19924
- parameters: {
19925
- type: "object",
19926
- properties: {
19927
- tenantId: { type: "string" },
19928
- where: { type: "string", description: `Xero where clause, e.g. 'Status=="AUTHORISED"'.` },
19929
- order: { type: "string", description: 'Sort expression, e.g. "Date DESC".' },
19930
- page: { type: "integer", minimum: 1 }
19931
- },
19932
- required: ["tenantId"]
19933
- },
19934
- request: {
19935
- method: "GET",
19936
- path: "/api.xro/2.0/Invoices",
19937
- query: { where: "{where}", order: "{order}", page: "{page}" },
19938
- headers: { "xero-tenant-id": "{tenantId}" }
19939
- },
19940
- requiredScopes: ["accounting.transactions"]
19941
- },
19942
- {
19943
- name: "invoices.get",
19944
- class: "read",
19945
- description: "Read a single Xero invoice by InvoiceID or InvoiceNumber.",
19946
- parameters: {
19947
- type: "object",
19948
- properties: {
19949
- tenantId: { type: "string" },
19950
- invoiceId: { type: "string", description: "Xero InvoiceID (GUID) or InvoiceNumber." }
19951
- },
19952
- required: ["tenantId", "invoiceId"]
19953
- },
19954
- request: {
19955
- method: "GET",
19956
- path: "/api.xro/2.0/Invoices/{invoiceId}",
19957
- headers: { "xero-tenant-id": "{tenantId}" }
19958
- },
19959
- requiredScopes: ["accounting.transactions"]
19960
- },
19961
- {
19962
- name: "invoices.create",
19963
- class: "mutation",
19964
- description: "Create a Xero invoice (AR or AP). Pass an Invoices array per the Xero API contract.",
19965
- parameters: {
19966
- type: "object",
19967
- properties: {
19968
- tenantId: { type: "string" },
19969
- Invoices: {
19970
- type: "array",
19971
- items: {
19972
- type: "object",
19973
- properties: {
19974
- Type: { type: "string", enum: ["ACCREC", "ACCPAY"] },
19975
- Contact: { type: "object" },
19976
- LineItems: { type: "array", items: { type: "object" } },
19977
- Date: { type: "string", description: "YYYY-MM-DD." },
19978
- DueDate: { type: "string", description: "YYYY-MM-DD." },
19979
- Reference: { type: "string" },
19980
- Status: { type: "string", enum: ["DRAFT", "SUBMITTED", "AUTHORISED"] }
19981
- },
19982
- required: ["Type", "Contact", "LineItems"]
19983
- }
19984
- }
19985
- },
19986
- required: ["tenantId", "Invoices"]
19987
- },
19988
- request: {
19989
- method: "POST",
19990
- path: "/api.xro/2.0/Invoices",
19991
- body: { Invoices: "{Invoices}" },
19992
- headers: { "xero-tenant-id": "{tenantId}" }
19993
- },
19994
- cas: "native-idempotency",
19995
- requiredScopes: ["accounting.transactions"]
19996
- },
19997
- {
19998
- name: "accounts.search",
19999
- class: "read",
20000
- description: "List Xero chart-of-account records for a tenant.",
20001
- parameters: {
20002
- type: "object",
20003
- properties: {
20004
- tenantId: { type: "string" },
20005
- where: { type: "string", description: `Xero where clause, e.g. 'Type=="REVENUE"'.` },
20006
- order: { type: "string" }
20007
- },
20008
- required: ["tenantId"]
20009
- },
20010
- request: {
20011
- method: "GET",
20012
- path: "/api.xro/2.0/Accounts",
20013
- query: { where: "{where}", order: "{order}" },
20014
- headers: { "xero-tenant-id": "{tenantId}" }
20015
- },
20016
- requiredScopes: ["accounting.settings.read"]
20017
- },
20018
- {
20019
- name: "contacts.archive",
20020
- class: "mutation",
20021
- description: "Archive a Xero contact (sets ContactStatus to ARCHIVED).",
20022
- parameters: {
20023
- type: "object",
20024
- properties: {
20025
- tenantId: { type: "string" },
20026
- contactId: { type: "string", description: "Xero ContactID (GUID)." }
20027
- },
20028
- required: ["tenantId", "contactId"]
20029
- },
20030
- request: {
20031
- method: "POST",
20032
- path: "/api.xro/2.0/Contacts/{contactId}",
20033
- body: { ContactStatus: "ARCHIVED" },
20034
- headers: { "xero-tenant-id": "{tenantId}" }
20035
- },
20036
- cas: "native-idempotency",
20037
- externalEffect: true,
20038
- requiredScopes: ["accounting.contacts"]
20039
- },
20040
- {
20041
- name: "invoices.delete",
20042
- class: "mutation",
20043
- description: "Void or delete a Xero invoice. DRAFT/SUBMITTED invoices accept DELETED, AUTHORISED invoices accept VOIDED.",
20044
- parameters: {
20045
- type: "object",
20046
- properties: {
20047
- tenantId: { type: "string" },
20048
- invoiceId: { type: "string", description: "Xero InvoiceID (GUID) or InvoiceNumber." },
20049
- status: {
20050
- type: "string",
20051
- enum: ["VOIDED", "DELETED"],
20052
- description: "Target status. VOIDED for authorised invoices, DELETED for draft/submitted invoices."
20053
- }
20054
- },
20055
- required: ["tenantId", "invoiceId", "status"]
20056
- },
20057
- request: {
20058
- method: "POST",
20059
- path: "/api.xro/2.0/Invoices/{invoiceId}",
20060
- body: { Status: "{status}" },
20061
- headers: { "xero-tenant-id": "{tenantId}" }
20062
- },
20063
- cas: "native-idempotency",
20064
- externalEffect: true,
20065
- requiredScopes: ["accounting.transactions"]
20066
- },
20067
- {
20068
- name: "invoices.email",
20069
- class: "mutation",
20070
- description: "Email a Xero invoice to its contact using the saved template.",
20071
- parameters: {
20072
- type: "object",
20073
- properties: {
20074
- tenantId: { type: "string" },
20075
- invoiceId: { type: "string", description: "Xero InvoiceID (GUID) or InvoiceNumber." }
20076
- },
20077
- required: ["tenantId", "invoiceId"]
20078
- },
20079
- request: {
20080
- method: "POST",
20081
- path: "/api.xro/2.0/Invoices/{invoiceId}/Email",
20082
- body: {},
20083
- headers: { "xero-tenant-id": "{tenantId}" }
20084
- },
20085
- cas: "native-idempotency",
20086
- externalEffect: true,
20087
- requiredScopes: ["accounting.transactions"]
20088
- },
20089
- {
20090
- name: "payments.create",
20091
- class: "mutation",
20092
- description: "Apply a payment to a Xero invoice or credit note. Pass a Payments array per the Xero API contract.",
20093
- parameters: {
20094
- type: "object",
20095
- properties: {
20096
- tenantId: { type: "string" },
20097
- Payments: {
20098
- type: "array",
20099
- items: {
20100
- type: "object",
20101
- properties: {
20102
- Invoice: { type: "object", description: 'Invoice reference, e.g. { InvoiceID: "..." }.' },
20103
- CreditNote: { type: "object", description: 'CreditNote reference, e.g. { CreditNoteID: "..." }.' },
20104
- Account: { type: "object", description: 'Bank account reference, e.g. { Code: "090" }.' },
20105
- Date: { type: "string", description: "YYYY-MM-DD." },
20106
- Amount: { type: "number" },
20107
- Reference: { type: "string" }
20108
- },
20109
- required: ["Account", "Date", "Amount"]
20110
- }
20111
- }
20112
- },
20113
- required: ["tenantId", "Payments"]
20114
- },
20115
- request: {
20116
- method: "POST",
20117
- path: "/api.xro/2.0/Payments",
20118
- body: { Payments: "{Payments}" },
20119
- headers: { "xero-tenant-id": "{tenantId}" }
20120
- },
20121
- cas: "native-idempotency",
20122
- externalEffect: true,
20123
- requiredScopes: ["accounting.transactions"]
20124
- },
20125
- {
20126
- name: "credit-notes.create",
20127
- class: "mutation",
20128
- description: "Create a Xero credit note (ACCRECCREDIT or ACCPAYCREDIT). Pass a CreditNotes array per the Xero API contract.",
20129
- parameters: {
20130
- type: "object",
20131
- properties: {
20132
- tenantId: { type: "string" },
20133
- CreditNotes: {
20134
- type: "array",
20135
- items: {
20136
- type: "object",
20137
- properties: {
20138
- Type: { type: "string", enum: ["ACCRECCREDIT", "ACCPAYCREDIT"] },
20139
- Contact: { type: "object" },
20140
- LineItems: { type: "array", items: { type: "object" } },
20141
- Date: { type: "string", description: "YYYY-MM-DD." },
20142
- Reference: { type: "string" },
20143
- Status: { type: "string", enum: ["DRAFT", "SUBMITTED", "AUTHORISED"] }
20144
- },
20145
- required: ["Type", "Contact", "LineItems"]
20146
- }
20147
- }
20148
- },
20149
- required: ["tenantId", "CreditNotes"]
20150
- },
20151
- request: {
20152
- method: "POST",
20153
- path: "/api.xro/2.0/CreditNotes",
20154
- body: { CreditNotes: "{CreditNotes}" },
20155
- headers: { "xero-tenant-id": "{tenantId}" }
20156
- },
20157
- cas: "native-idempotency",
20158
- externalEffect: true,
20159
- requiredScopes: ["accounting.transactions"]
20160
- }
20161
- ]
20162
- });
20163
-
20164
20175
  // src/connectors/adapters/gusto.ts
20165
20176
  var gustoConnector = declarativeRestConnector({
20166
20177
  kind: "gusto",
@@ -127238,11 +127249,13 @@ export {
127238
127249
  oneDrive,
127239
127250
  outlookMail,
127240
127251
  pandadoc,
127252
+ quickbooksConnector,
127241
127253
  sharepoint,
127242
127254
  slack,
127243
127255
  twitterConnector,
127244
127256
  twitter,
127245
127257
  whatsappBusiness,
127258
+ xeroConnector,
127246
127259
  CONNECTOR_ADAPTER_FACTORIES,
127247
127260
  resolveConnectorAdapterFactoryOptions,
127248
127261
  googleSlidesConnector,
@@ -127273,8 +127286,6 @@ export {
127273
127286
  zohoCrmConnector,
127274
127287
  zohoDeskConnector,
127275
127288
  attioConnector,
127276
- quickbooksConnector,
127277
- xeroConnector,
127278
127289
  gustoConnector,
127279
127290
  bigcommerceConnector,
127280
127291
  shopifyConnector,
@@ -127763,4 +127774,4 @@ export {
127763
127774
  demandbaseConnector,
127764
127775
  adapters_exports
127765
127776
  };
127766
- //# sourceMappingURL=chunk-JOQQ2VYH.js.map
127777
+ //# sourceMappingURL=chunk-XOOZW3XK.js.map