@arbium/enterprise-agent-connect 0.0.0-stage → 0.1.2-dev.d2aa5ca
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.
- package/LICENSE +202 -0
- package/README.md +264 -2
- package/dist/connectors/dell-techdirect/connector.json +39 -0
- package/dist/connectors/dell-techdirect/index.d.ts +8 -0
- package/dist/connectors/dell-techdirect/index.js +7 -0
- package/dist/connectors/dell-techdirect/index.js.map +1 -0
- package/dist/connectors/dell-techdirect/tools.d.ts +2 -0
- package/dist/connectors/dell-techdirect/tools.js +49 -0
- package/dist/connectors/dell-techdirect/tools.js.map +1 -0
- package/dist/connectors/dell-techdirect/vendor.d.ts +6 -0
- package/dist/connectors/dell-techdirect/vendor.js +57 -0
- package/dist/connectors/dell-techdirect/vendor.js.map +1 -0
- package/dist/connectors/dynamics-365/connector.json +213 -0
- package/dist/connectors/dynamics-365/index.d.ts +11 -0
- package/dist/connectors/dynamics-365/index.js +10 -0
- package/dist/connectors/dynamics-365/index.js.map +1 -0
- package/dist/connectors/dynamics-365/tools.d.ts +35 -0
- package/dist/connectors/dynamics-365/tools.js +806 -0
- package/dist/connectors/dynamics-365/tools.js.map +1 -0
- package/dist/connectors/dynamics-365/vendor.d.ts +9 -0
- package/dist/connectors/dynamics-365/vendor.js +110 -0
- package/dist/connectors/dynamics-365/vendor.js.map +1 -0
- package/dist/connectors/entra/connector.json +85 -0
- package/dist/connectors/entra/index.d.ts +2 -0
- package/dist/connectors/entra/index.js +4 -0
- package/dist/connectors/entra/index.js.map +1 -0
- package/dist/connectors/entra/tools.d.ts +14 -0
- package/dist/connectors/entra/tools.js +262 -0
- package/dist/connectors/entra/tools.js.map +1 -0
- package/dist/connectors/fedex/connector.json +118 -0
- package/dist/connectors/fedex/index.d.ts +8 -0
- package/dist/connectors/fedex/index.js +7 -0
- package/dist/connectors/fedex/index.js.map +1 -0
- package/dist/connectors/fedex/tools.d.ts +3 -0
- package/dist/connectors/fedex/tools.js +152 -0
- package/dist/connectors/fedex/tools.js.map +1 -0
- package/dist/connectors/fedex/vendor.d.ts +7 -0
- package/dist/connectors/fedex/vendor.js +98 -0
- package/dist/connectors/fedex/vendor.js.map +1 -0
- package/dist/connectors/gong/connector.json +127 -0
- package/dist/connectors/gong/index.d.ts +8 -0
- package/dist/connectors/gong/index.js +7 -0
- package/dist/connectors/gong/index.js.map +1 -0
- package/dist/connectors/gong/tools.d.ts +8 -0
- package/dist/connectors/gong/tools.js +424 -0
- package/dist/connectors/gong/tools.js.map +1 -0
- package/dist/connectors/gong/vendor.d.ts +4 -0
- package/dist/connectors/gong/vendor.js +97 -0
- package/dist/connectors/gong/vendor.js.map +1 -0
- package/dist/connectors/http/index.d.ts +38 -0
- package/dist/connectors/http/index.js +322 -0
- package/dist/connectors/http/index.js.map +1 -0
- package/dist/connectors/intune/connector.json +106 -0
- package/dist/connectors/intune/index.d.ts +2 -0
- package/dist/connectors/intune/index.js +4 -0
- package/dist/connectors/intune/index.js.map +1 -0
- package/dist/connectors/intune/tools.d.ts +12 -0
- package/dist/connectors/intune/tools.js +416 -0
- package/dist/connectors/intune/tools.js.map +1 -0
- package/dist/connectors/jamf/connector.json +182 -0
- package/dist/connectors/jamf/index.d.ts +8 -0
- package/dist/connectors/jamf/index.js +7 -0
- package/dist/connectors/jamf/index.js.map +1 -0
- package/dist/connectors/jamf/tools.d.ts +7 -0
- package/dist/connectors/jamf/tools.js +659 -0
- package/dist/connectors/jamf/tools.js.map +1 -0
- package/dist/connectors/jamf/vendor.d.ts +5 -0
- package/dist/connectors/jamf/vendor.js +66 -0
- package/dist/connectors/jamf/vendor.js.map +1 -0
- package/dist/connectors/jira/connector.json +272 -0
- package/dist/connectors/jira/index.d.ts +8 -0
- package/dist/connectors/jira/index.js +7 -0
- package/dist/connectors/jira/index.js.map +1 -0
- package/dist/connectors/jira/jql.d.ts +4 -0
- package/dist/connectors/jira/jql.js +67 -0
- package/dist/connectors/jira/jql.js.map +1 -0
- package/dist/connectors/jira/tools.d.ts +3 -0
- package/dist/connectors/jira/tools.js +464 -0
- package/dist/connectors/jira/tools.js.map +1 -0
- package/dist/connectors/jira/vendor.d.ts +3 -0
- package/dist/connectors/jira/vendor.js +94 -0
- package/dist/connectors/jira/vendor.js.map +1 -0
- package/dist/connectors/microsoft/client.d.ts +58 -0
- package/dist/connectors/microsoft/client.js +434 -0
- package/dist/connectors/microsoft/client.js.map +1 -0
- package/dist/connectors/microsoft/provider.json +118 -0
- package/dist/connectors/netsuite/connector.json +315 -0
- package/dist/connectors/netsuite/index.d.ts +8 -0
- package/dist/connectors/netsuite/index.js +7 -0
- package/dist/connectors/netsuite/index.js.map +1 -0
- package/dist/connectors/netsuite/tools.d.ts +24 -0
- package/dist/connectors/netsuite/tools.js +447 -0
- package/dist/connectors/netsuite/tools.js.map +1 -0
- package/dist/connectors/netsuite/vendor.d.ts +26 -0
- package/dist/connectors/netsuite/vendor.js +248 -0
- package/dist/connectors/netsuite/vendor.js.map +1 -0
- package/dist/connectors/odata/index.d.ts +36 -0
- package/dist/connectors/odata/index.js +460 -0
- package/dist/connectors/odata/index.js.map +1 -0
- package/dist/connectors/okta/connector.json +193 -0
- package/dist/connectors/okta/index.d.ts +8 -0
- package/dist/connectors/okta/index.js +7 -0
- package/dist/connectors/okta/index.js.map +1 -0
- package/dist/connectors/okta/tools.d.ts +6 -0
- package/dist/connectors/okta/tools.js +429 -0
- package/dist/connectors/okta/tools.js.map +1 -0
- package/dist/connectors/okta/vendor.d.ts +14 -0
- package/dist/connectors/okta/vendor.js +203 -0
- package/dist/connectors/okta/vendor.js.map +1 -0
- package/dist/connectors/outlook-calendar/connector.json +136 -0
- package/dist/connectors/outlook-calendar/index.d.ts +2 -0
- package/dist/connectors/outlook-calendar/index.js +4 -0
- package/dist/connectors/outlook-calendar/index.js.map +1 -0
- package/dist/connectors/outlook-calendar/tools.d.ts +65 -0
- package/dist/connectors/outlook-calendar/tools.js +398 -0
- package/dist/connectors/outlook-calendar/tools.js.map +1 -0
- package/dist/connectors/outlook-mail/connector.json +154 -0
- package/dist/connectors/outlook-mail/index.d.ts +2 -0
- package/dist/connectors/outlook-mail/index.js +4 -0
- package/dist/connectors/outlook-mail/index.js.map +1 -0
- package/dist/connectors/outlook-mail/tools.d.ts +8 -0
- package/dist/connectors/outlook-mail/tools.js +236 -0
- package/dist/connectors/outlook-mail/tools.js.map +1 -0
- package/dist/connectors/salesforce/connector.json +122 -0
- package/dist/connectors/salesforce/index.d.ts +8 -0
- package/dist/connectors/salesforce/index.js +7 -0
- package/dist/connectors/salesforce/index.js.map +1 -0
- package/dist/connectors/salesforce/soql.d.ts +3 -0
- package/dist/connectors/salesforce/soql.js +60 -0
- package/dist/connectors/salesforce/soql.js.map +1 -0
- package/dist/connectors/salesforce/tools.d.ts +9 -0
- package/dist/connectors/salesforce/tools.js +234 -0
- package/dist/connectors/salesforce/tools.js.map +1 -0
- package/dist/connectors/salesforce/vendor.d.ts +3 -0
- package/dist/connectors/salesforce/vendor.js +107 -0
- package/dist/connectors/salesforce/vendor.js.map +1 -0
- package/dist/connectors/sap-s4hana/connector.json +263 -0
- package/dist/connectors/sap-s4hana/index.d.ts +8 -0
- package/dist/connectors/sap-s4hana/index.js +7 -0
- package/dist/connectors/sap-s4hana/index.js.map +1 -0
- package/dist/connectors/sap-s4hana/tools.d.ts +4 -0
- package/dist/connectors/sap-s4hana/tools.js +761 -0
- package/dist/connectors/sap-s4hana/tools.js.map +1 -0
- package/dist/connectors/sap-s4hana/vendor.d.ts +5 -0
- package/dist/connectors/sap-s4hana/vendor.js +176 -0
- package/dist/connectors/sap-s4hana/vendor.js.map +1 -0
- package/dist/connectors/servicenow/connector.json +228 -0
- package/dist/connectors/servicenow/index.d.ts +8 -0
- package/dist/connectors/servicenow/index.js +7 -0
- package/dist/connectors/servicenow/index.js.map +1 -0
- package/dist/connectors/servicenow/tools.d.ts +4 -0
- package/dist/connectors/servicenow/tools.js +884 -0
- package/dist/connectors/servicenow/tools.js.map +1 -0
- package/dist/connectors/servicenow/vendor.d.ts +4 -0
- package/dist/connectors/servicenow/vendor.js +109 -0
- package/dist/connectors/servicenow/vendor.js.map +1 -0
- package/dist/connectors/sharepoint-files/connector.json +194 -0
- package/dist/connectors/sharepoint-files/excel.d.ts +16 -0
- package/dist/connectors/sharepoint-files/excel.js +300 -0
- package/dist/connectors/sharepoint-files/excel.js.map +1 -0
- package/dist/connectors/sharepoint-files/index.d.ts +11 -0
- package/dist/connectors/sharepoint-files/index.js +12 -0
- package/dist/connectors/sharepoint-files/index.js.map +1 -0
- package/dist/connectors/sharepoint-files/tools.d.ts +52 -0
- package/dist/connectors/sharepoint-files/tools.js +365 -0
- package/dist/connectors/sharepoint-files/tools.js.map +1 -0
- package/dist/connectors/sharepoint-files/vendor.d.ts +11 -0
- package/dist/connectors/sharepoint-files/vendor.js +167 -0
- package/dist/connectors/sharepoint-files/vendor.js.map +1 -0
- package/dist/connectors/slack/connector.json +148 -0
- package/dist/connectors/slack/index.d.ts +8 -0
- package/dist/connectors/slack/index.js +7 -0
- package/dist/connectors/slack/index.js.map +1 -0
- package/dist/connectors/slack/tools.d.ts +3 -0
- package/dist/connectors/slack/tools.js +355 -0
- package/dist/connectors/slack/tools.js.map +1 -0
- package/dist/connectors/slack/vendor.d.ts +17 -0
- package/dist/connectors/slack/vendor.js +195 -0
- package/dist/connectors/slack/vendor.js.map +1 -0
- package/dist/connectors/soap/index.d.ts +19 -0
- package/dist/connectors/soap/index.js +248 -0
- package/dist/connectors/soap/index.js.map +1 -0
- package/dist/connectors/soap/xml.d.ts +12 -0
- package/dist/connectors/soap/xml.js +126 -0
- package/dist/connectors/soap/xml.js.map +1 -0
- package/dist/connectors/sql/engines.d.ts +58 -0
- package/dist/connectors/sql/engines.js +292 -0
- package/dist/connectors/sql/engines.js.map +1 -0
- package/dist/connectors/sql/index.d.ts +19 -0
- package/dist/connectors/sql/index.js +212 -0
- package/dist/connectors/sql/index.js.map +1 -0
- package/dist/connectors/teams/connector.json +298 -0
- package/dist/connectors/teams/index.d.ts +2 -0
- package/dist/connectors/teams/index.js +5 -0
- package/dist/connectors/teams/index.js.map +1 -0
- package/dist/connectors/teams/tools.d.ts +2 -0
- package/dist/connectors/teams/tools.js +391 -0
- package/dist/connectors/teams/tools.js.map +1 -0
- package/dist/connectors/workday/connector.json +186 -0
- package/dist/connectors/workday/index.d.ts +8 -0
- package/dist/connectors/workday/index.js +7 -0
- package/dist/connectors/workday/index.js.map +1 -0
- package/dist/connectors/workday/tools.d.ts +33 -0
- package/dist/connectors/workday/tools.js +410 -0
- package/dist/connectors/workday/tools.js.map +1 -0
- package/dist/connectors/workday/vendor.d.ts +18 -0
- package/dist/connectors/workday/vendor.js +195 -0
- package/dist/connectors/workday/vendor.js.map +1 -0
- package/dist/packages/connector-kit/src/branding.d.ts +57 -0
- package/dist/packages/connector-kit/src/branding.js +102 -0
- package/dist/packages/connector-kit/src/branding.js.map +1 -0
- package/dist/packages/connector-kit/src/certificate.d.ts +19 -0
- package/dist/packages/connector-kit/src/certificate.js +84 -0
- package/dist/packages/connector-kit/src/certificate.js.map +1 -0
- package/dist/packages/connector-kit/src/common.d.ts +40 -0
- package/dist/packages/connector-kit/src/common.js +107 -0
- package/dist/packages/connector-kit/src/common.js.map +1 -0
- package/dist/packages/connector-kit/src/connector.d.ts +1346 -0
- package/dist/packages/connector-kit/src/connector.js +1034 -0
- package/dist/packages/connector-kit/src/connector.js.map +1 -0
- package/dist/packages/connector-kit/src/index.d.ts +5 -0
- package/dist/packages/connector-kit/src/index.js +5 -0
- package/dist/packages/connector-kit/src/index.js.map +1 -0
- package/dist/packages/connector-kit/src/oauth.d.ts +15 -0
- package/dist/packages/connector-kit/src/oauth.js +96 -0
- package/dist/packages/connector-kit/src/oauth.js.map +1 -0
- package/dist/packages/connector-kit/src/types.d.ts +85 -0
- package/dist/packages/connector-kit/src/types.js +20 -0
- package/dist/packages/connector-kit/src/types.js.map +1 -0
- package/dist/packages/server/migrations/0001_tables.sql +268 -0
- package/dist/packages/server/migrations/0002_organizations.sql +72 -0
- package/dist/packages/server/migrations/0003_drop_unused.sql +3 -0
- package/dist/packages/server/migrations/0004_trigger_runners.sql +15 -0
- package/dist/packages/server/migrations/0005_run_runner.sql +3 -0
- package/dist/packages/server/migrations/0006_approvals.sql +36 -0
- package/dist/packages/server/migrations/0007_app_events.sql +110 -0
- package/dist/packages/server/migrations/rollback/to-legacy.sql +90 -0
- package/dist/packages/server/src/api.d.ts +3714 -0
- package/dist/packages/server/src/api.js +818 -0
- package/dist/packages/server/src/api.js.map +1 -0
- package/dist/packages/server/src/app.d.ts +23 -0
- package/dist/packages/server/src/app.js +467 -0
- package/dist/packages/server/src/app.js.map +1 -0
- package/dist/packages/server/src/builtin.d.ts +4 -0
- package/dist/packages/server/src/builtin.js +42 -0
- package/dist/packages/server/src/builtin.js.map +1 -0
- package/dist/packages/server/src/consent.d.ts +27 -0
- package/dist/packages/server/src/consent.js +36 -0
- package/dist/packages/server/src/consent.js.map +1 -0
- package/dist/packages/server/src/events/admin.d.ts +156 -0
- package/dist/packages/server/src/events/admin.js +255 -0
- package/dist/packages/server/src/events/admin.js.map +1 -0
- package/dist/packages/server/src/events/deliver.d.ts +43 -0
- package/dist/packages/server/src/events/deliver.js +129 -0
- package/dist/packages/server/src/events/deliver.js.map +1 -0
- package/dist/packages/server/src/events/runtime.d.ts +28 -0
- package/dist/packages/server/src/events/runtime.js +397 -0
- package/dist/packages/server/src/events/runtime.js.map +1 -0
- package/dist/packages/server/src/events/store.d.ts +172 -0
- package/dist/packages/server/src/events/store.js +275 -0
- package/dist/packages/server/src/events/store.js.map +1 -0
- package/dist/packages/server/src/index.d.ts +40 -0
- package/dist/packages/server/src/index.js +185 -0
- package/dist/packages/server/src/index.js.map +1 -0
- package/dist/packages/server/src/migrate.d.ts +11 -0
- package/dist/packages/server/src/migrate.js +134 -0
- package/dist/packages/server/src/migrate.js.map +1 -0
- package/dist/packages/server/src/openapi.d.ts +4 -0
- package/dist/packages/server/src/openapi.js +101 -0
- package/dist/packages/server/src/openapi.js.map +1 -0
- package/dist/packages/server/src/queue.d.ts +10 -0
- package/dist/packages/server/src/queue.js +45 -0
- package/dist/packages/server/src/queue.js.map +1 -0
- package/dist/packages/server/src/secrets.d.ts +19 -0
- package/dist/packages/server/src/secrets.js +76 -0
- package/dist/packages/server/src/secrets.js.map +1 -0
- package/dist/packages/server/src/server.d.ts +1 -0
- package/dist/packages/server/src/server.js +82 -0
- package/dist/packages/server/src/server.js.map +1 -0
- package/dist/packages/server/src/service.d.ts +760 -0
- package/dist/packages/server/src/service.js +918 -0
- package/dist/packages/server/src/service.js.map +1 -0
- package/dist/packages/server/src/store.d.ts +158 -0
- package/dist/packages/server/src/store.js +415 -0
- package/dist/packages/server/src/store.js.map +1 -0
- package/dist/packages/server/src/teams/activity.d.ts +123 -0
- package/dist/packages/server/src/teams/activity.js +188 -0
- package/dist/packages/server/src/teams/activity.js.map +1 -0
- package/dist/packages/server/src/teams/admin.d.ts +335 -0
- package/dist/packages/server/src/teams/admin.js +699 -0
- package/dist/packages/server/src/teams/admin.js.map +1 -0
- package/dist/packages/server/src/teams/approval.d.ts +57 -0
- package/dist/packages/server/src/teams/approval.js +118 -0
- package/dist/packages/server/src/teams/approval.js.map +1 -0
- package/dist/packages/server/src/teams/bot.d.ts +25 -0
- package/dist/packages/server/src/teams/bot.js +124 -0
- package/dist/packages/server/src/teams/bot.js.map +1 -0
- package/dist/packages/server/src/teams/claude.d.ts +46 -0
- package/dist/packages/server/src/teams/claude.js +165 -0
- package/dist/packages/server/src/teams/claude.js.map +1 -0
- package/dist/packages/server/src/teams/jwt.d.ts +17 -0
- package/dist/packages/server/src/teams/jwt.js +121 -0
- package/dist/packages/server/src/teams/jwt.js.map +1 -0
- package/dist/packages/server/src/teams/package.d.ts +79 -0
- package/dist/packages/server/src/teams/package.js +319 -0
- package/dist/packages/server/src/teams/package.js.map +1 -0
- package/dist/packages/server/src/teams/provision.d.ts +84 -0
- package/dist/packages/server/src/teams/provision.js +505 -0
- package/dist/packages/server/src/teams/provision.js.map +1 -0
- package/dist/packages/server/src/teams/runner.d.ts +80 -0
- package/dist/packages/server/src/teams/runner.js +187 -0
- package/dist/packages/server/src/teams/runner.js.map +1 -0
- package/dist/packages/server/src/teams/runtime.d.ts +91 -0
- package/dist/packages/server/src/teams/runtime.js +679 -0
- package/dist/packages/server/src/teams/runtime.js.map +1 -0
- package/dist/packages/server/src/teams/store.d.ts +233 -0
- package/dist/packages/server/src/teams/store.js +507 -0
- package/dist/packages/server/src/teams/store.js.map +1 -0
- package/package.json +68 -4
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { vendorError } from "../../packages/connector-kit/src/oauth.js";
|
|
3
|
+
import { ConnectError, TokenCache, } from "../../packages/connector-kit/src/types.js";
|
|
4
|
+
// A Workday API client for integrations, signing in as its Integration System User with a
|
|
5
|
+
// non-expiring refresh token (OAuth 2.0 refresh token grant at /ccx/oauth2/<tenant>/token, the
|
|
6
|
+
// client id and secret as HTTP Basic). REST calls under /ccx/api/<service>/<version>/<tenant>,
|
|
7
|
+
// custom reports (Reports-as-a-Service) under /ccx/service/customreport2/<tenant>. Service
|
|
8
|
+
// paths are Workday's REST directory (developer.workday.com, services_oas3.json, read October
|
|
9
|
+
// 27, 2026); its spec files need a Workday sign-in, so answer fields follow CData's Workday
|
|
10
|
+
// tables, which are generated from them.
|
|
11
|
+
const HOST = /^[a-z0-9-]+(\.[a-z0-9-]+)*\.(myworkday|workday)\.com$/;
|
|
12
|
+
const TENANT = /^[A-Za-z0-9_]{1,64}$/;
|
|
13
|
+
const REPORT_SEGMENT = /^[A-Za-z0-9_.\-]{1,200}$/;
|
|
14
|
+
const PROMPT = /^[A-Za-z0-9_!.\-]{1,100}$/;
|
|
15
|
+
const MAX_REPORTS = 30;
|
|
16
|
+
// Workday's token answer may carry no lifetime: reuse a token this long, re-mint once on a 401.
|
|
17
|
+
const DEFAULT_TOKEN_SECONDS = 600;
|
|
18
|
+
// The REST API endpoint shown on Workday's View API Clients page, e.g.
|
|
19
|
+
// https://wd5-services1.myworkday.com/ccx/api/v1/acme: host and tenant.
|
|
20
|
+
export function parseEndpoint(raw) {
|
|
21
|
+
let url;
|
|
22
|
+
try {
|
|
23
|
+
url = new URL(raw.trim());
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throw new ConnectError("Enter the Workday REST API endpoint, such as https://wd5-services1.myworkday.com/ccx/api/v1/acme");
|
|
27
|
+
}
|
|
28
|
+
const host = url.hostname.toLowerCase();
|
|
29
|
+
if (url.protocol !== "https:" || url.port || !HOST.test(host))
|
|
30
|
+
throw new ConnectError(`${url.host} is not a Workday address (ending myworkday.com or workday.com)`);
|
|
31
|
+
const tenant = /^\/ccx\/api\/(?:[A-Za-z]+\/)?v\d+\/([^/]+)\/?$/.exec(url.pathname)?.[1];
|
|
32
|
+
if (!tenant || !TENANT.test(tenant))
|
|
33
|
+
throw new ConnectError("The endpoint should end with /ccx/api/v1/<tenant>, as shown on the View API Clients page");
|
|
34
|
+
return { host, tenant };
|
|
35
|
+
}
|
|
36
|
+
// Each report's JSON link from Workday (the report's Actions > Web Service > View URLs > JSON),
|
|
37
|
+
// separated by spaces or new lines. Its query names are the report's prompts; one whose example
|
|
38
|
+
// value is a date takes dates.
|
|
39
|
+
export function parseReports(raw, host, tenant) {
|
|
40
|
+
const links = raw.split(/\s+/).filter(Boolean);
|
|
41
|
+
if (links.length > MAX_REPORTS)
|
|
42
|
+
throw new ConnectError(`Enter at most ${MAX_REPORTS} reports`);
|
|
43
|
+
const reports = links.map((link) => {
|
|
44
|
+
let url;
|
|
45
|
+
try {
|
|
46
|
+
url = new URL(link);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
throw new ConnectError(`${link.slice(0, 100)} is not a report link`);
|
|
50
|
+
}
|
|
51
|
+
const parts = url.pathname.split("/").map((p) => decodeURIComponent(p));
|
|
52
|
+
const [, ccx, service, kind, t, owner, report] = parts;
|
|
53
|
+
if (url.protocol !== "https:" ||
|
|
54
|
+
url.hostname.toLowerCase() !== host ||
|
|
55
|
+
ccx !== "ccx" ||
|
|
56
|
+
service !== "service" ||
|
|
57
|
+
kind !== "customreport2" ||
|
|
58
|
+
parts.length !== 7 ||
|
|
59
|
+
!REPORT_SEGMENT.test(owner ?? "") ||
|
|
60
|
+
!REPORT_SEGMENT.test(report ?? ""))
|
|
61
|
+
throw new ConnectError(`${link.slice(0, 100)} is not a custom report link on ${host} (…/ccx/service/customreport2/${tenant}/<owner>/<report>)`);
|
|
62
|
+
if (t !== tenant)
|
|
63
|
+
throw new ConnectError(`${report} belongs to tenant ${t}, not ${tenant}`);
|
|
64
|
+
const prompts = [];
|
|
65
|
+
for (const [name, value] of url.searchParams) {
|
|
66
|
+
if (name === "format")
|
|
67
|
+
continue;
|
|
68
|
+
if (!PROMPT.test(name))
|
|
69
|
+
throw new ConnectError(`${report}: ${name} is not a prompt name`);
|
|
70
|
+
prompts.push({ name, type: /^\d{4}-\d{2}-\d{2}/.test(value) ? "date" : "text" });
|
|
71
|
+
}
|
|
72
|
+
return { name: report, owner, report, prompts };
|
|
73
|
+
});
|
|
74
|
+
const names = reports.map((r) => r.name);
|
|
75
|
+
const twice = names.find((n, i) => names.indexOf(n) !== i);
|
|
76
|
+
if (twice)
|
|
77
|
+
throw new ConnectError(`${twice} is entered twice`);
|
|
78
|
+
return reports;
|
|
79
|
+
}
|
|
80
|
+
export function connectedReports(config) {
|
|
81
|
+
return config.reports ? JSON.parse(config.reports) : [];
|
|
82
|
+
}
|
|
83
|
+
export function workdayVendor(fetchImpl = fetch) {
|
|
84
|
+
const tokens = new TokenCache();
|
|
85
|
+
const key = (c) => createHash("sha256")
|
|
86
|
+
.update(`${c.config.host}\n${c.config.tenant}\n${c.secret.client_id}\n${c.secret.refresh_token}`)
|
|
87
|
+
.digest("hex");
|
|
88
|
+
async function mint(c) {
|
|
89
|
+
const { host, tenant } = c.config;
|
|
90
|
+
const res = await fetchImpl(`https://${host}/ccx/oauth2/${tenant}/token`, {
|
|
91
|
+
method: "POST",
|
|
92
|
+
headers: {
|
|
93
|
+
authorization: `Basic ${Buffer.from(`${c.secret.client_id}:${c.secret.client_secret}`).toString("base64")}`,
|
|
94
|
+
"content-type": "application/x-www-form-urlencoded",
|
|
95
|
+
accept: "application/json",
|
|
96
|
+
},
|
|
97
|
+
body: new URLSearchParams({
|
|
98
|
+
grant_type: "refresh_token",
|
|
99
|
+
refresh_token: c.secret.refresh_token,
|
|
100
|
+
}),
|
|
101
|
+
redirect: "manual",
|
|
102
|
+
});
|
|
103
|
+
const raw = await res.text();
|
|
104
|
+
const body = parse(raw);
|
|
105
|
+
if (!res.ok)
|
|
106
|
+
throw new ConnectError(`Workday refused the sign-in (${res.status}${vendorError(body) ? `: ${vendorError(body)}` : ""}). Check the client ID, secret and refresh token, and that the refresh token was made for this API client.`);
|
|
107
|
+
if (typeof body !== "object" || !body || typeof body.access_token !== "string")
|
|
108
|
+
throw new ConnectError("Workday answered the sign-in without a token");
|
|
109
|
+
const expiresIn = Number(body.expires_in);
|
|
110
|
+
return {
|
|
111
|
+
token: body.access_token,
|
|
112
|
+
expiresIn: Number.isFinite(expiresIn) && expiresIn > 60 ? expiresIn : DEFAULT_TOKEN_SECONDS,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async function send(c, access, request) {
|
|
116
|
+
const res = await fetchImpl(`https://${c.config.host}${request.path}`, {
|
|
117
|
+
method: request.method,
|
|
118
|
+
headers: {
|
|
119
|
+
authorization: `Bearer ${access}`,
|
|
120
|
+
accept: "application/json",
|
|
121
|
+
...(request.body === undefined ? {} : { "content-type": "application/json" }),
|
|
122
|
+
},
|
|
123
|
+
body: request.body === undefined ? undefined : JSON.stringify(request.body),
|
|
124
|
+
redirect: "manual",
|
|
125
|
+
});
|
|
126
|
+
const raw = await res.text();
|
|
127
|
+
return { status: res.status, data: raw ? parse(raw) : null };
|
|
128
|
+
}
|
|
129
|
+
const call = async (c, request) => {
|
|
130
|
+
if (!HOST.test(c.config.host ?? "") || !TENANT.test(c.config.tenant ?? ""))
|
|
131
|
+
throw new Error("Workday connection has no host or tenant");
|
|
132
|
+
if (!request.path.startsWith("/ccx/"))
|
|
133
|
+
throw new Error(`Not a Workday path: ${request.path}`);
|
|
134
|
+
let res = await send(c, await tokens.get(key(c), () => mint(c)), request);
|
|
135
|
+
if (res.status === 401) {
|
|
136
|
+
tokens.forget(key(c));
|
|
137
|
+
res = await send(c, await tokens.get(key(c), () => mint(c)), request);
|
|
138
|
+
}
|
|
139
|
+
return res;
|
|
140
|
+
};
|
|
141
|
+
return {
|
|
142
|
+
async connect(fields) {
|
|
143
|
+
const { host, tenant } = parseEndpoint(fields.endpoint ?? "");
|
|
144
|
+
const clientId = fields.client_id?.trim();
|
|
145
|
+
const clientSecret = fields.client_secret?.trim();
|
|
146
|
+
const refreshToken = fields.refresh_token?.trim();
|
|
147
|
+
if (!clientId || !clientSecret || !refreshToken)
|
|
148
|
+
throw new ConnectError("Enter the client ID, client secret and refresh token");
|
|
149
|
+
const reports = parseReports(fields.reports ?? "", host, tenant);
|
|
150
|
+
const orgColumn = fields.report_org_column?.trim() ?? "";
|
|
151
|
+
if (orgColumn && !PROMPT.test(orgColumn))
|
|
152
|
+
throw new ConnectError(`${orgColumn} is not a report column name`);
|
|
153
|
+
const conn = {
|
|
154
|
+
config: {
|
|
155
|
+
host,
|
|
156
|
+
tenant,
|
|
157
|
+
account: `${host}/${tenant}`,
|
|
158
|
+
reports: JSON.stringify(reports),
|
|
159
|
+
...(orgColumn ? { reportOrgColumn: orgColumn } : {}),
|
|
160
|
+
},
|
|
161
|
+
secret: { client_id: clientId, client_secret: clientSecret, refresh_token: refreshToken },
|
|
162
|
+
};
|
|
163
|
+
tokens.forget(key(conn));
|
|
164
|
+
await tokens.get(key(conn), () => mint(conn));
|
|
165
|
+
return { ...conn, accountLabel: `${tenant} (${host})` };
|
|
166
|
+
},
|
|
167
|
+
call,
|
|
168
|
+
checks: {
|
|
169
|
+
// One worker read proves the account reaches staffing data; nothing of it is shown.
|
|
170
|
+
async tenant(connection) {
|
|
171
|
+
const res = await call(connection, {
|
|
172
|
+
method: "GET",
|
|
173
|
+
path: `/ccx/api/staffing/v7/${connection.config.tenant}/workers?limit=1`,
|
|
174
|
+
});
|
|
175
|
+
if (res.status === 401 || res.status === 403)
|
|
176
|
+
throw new ConnectError(`Workday refused to list workers (${res.status}). Give the account's security group View on Worker Data: Public Worker Reports, activate the pending security policy changes, then check again.`);
|
|
177
|
+
if (res.status < 200 || res.status >= 300)
|
|
178
|
+
throw new ConnectError(`Workday answered ${res.status}: ${vendorError(res.data) || "no reason given"}`);
|
|
179
|
+
return { values: [`${connection.config.tenant} (${connection.config.host})`] };
|
|
180
|
+
},
|
|
181
|
+
async reports(connection) {
|
|
182
|
+
return { values: connectedReports(connection.config).map((r) => r.name) };
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function parse(raw) {
|
|
188
|
+
try {
|
|
189
|
+
return JSON.parse(raw);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return raw;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=vendor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../../connectors/workday/vendor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const brandingSchema: z.ZodObject<{
|
|
3
|
+
productName: z.ZodDefault<z.ZodString>;
|
|
4
|
+
logoUrl: z.ZodOptional<z.ZodURL>;
|
|
5
|
+
resourcePrefix: z.ZodDefault<z.ZodString>;
|
|
6
|
+
microsoft: z.ZodDefault<z.ZodObject<{
|
|
7
|
+
appName: z.ZodDefault<z.ZodString>;
|
|
8
|
+
mailboxGroup: z.ZodDefault<z.ZodString>;
|
|
9
|
+
mailboxGroupAlias: z.ZodDefault<z.ZodString>;
|
|
10
|
+
botRole: z.ZodDefault<z.ZodString>;
|
|
11
|
+
}, z.core.$strict>>;
|
|
12
|
+
teams: z.ZodDefault<z.ZodObject<{
|
|
13
|
+
resourceGroup: z.ZodDefault<z.ZodString>;
|
|
14
|
+
developer: z.ZodOptional<z.ZodObject<{
|
|
15
|
+
name: z.ZodString;
|
|
16
|
+
websiteUrl: z.ZodURL;
|
|
17
|
+
privacyUrl: z.ZodURL;
|
|
18
|
+
termsOfUseUrl: z.ZodURL;
|
|
19
|
+
}, z.core.$strict>>;
|
|
20
|
+
}, z.core.$strict>>;
|
|
21
|
+
}, z.core.$strict>;
|
|
22
|
+
export type Branding = z.infer<typeof brandingSchema>;
|
|
23
|
+
export type BrandingInput = z.input<typeof brandingSchema>;
|
|
24
|
+
export declare const DEFAULT_BRANDING: Branding;
|
|
25
|
+
export declare function parseBranding(raw: unknown): Branding;
|
|
26
|
+
export declare const brand: () => {
|
|
27
|
+
productName: string;
|
|
28
|
+
resourcePrefix: string;
|
|
29
|
+
microsoft: {
|
|
30
|
+
appName: string;
|
|
31
|
+
mailboxGroup: string;
|
|
32
|
+
mailboxGroupAlias: string;
|
|
33
|
+
botRole: string;
|
|
34
|
+
};
|
|
35
|
+
teams: {
|
|
36
|
+
resourceGroup: string;
|
|
37
|
+
developer?: {
|
|
38
|
+
name: string;
|
|
39
|
+
websiteUrl: string;
|
|
40
|
+
privacyUrl: string;
|
|
41
|
+
termsOfUseUrl: string;
|
|
42
|
+
} | undefined;
|
|
43
|
+
};
|
|
44
|
+
logoUrl?: string | undefined;
|
|
45
|
+
};
|
|
46
|
+
export declare function setBranding(b: Branding): void;
|
|
47
|
+
/** Fills `{brand.a.b}` placeholders; one naming no text field of the branding throws. */
|
|
48
|
+
export declare function fillBrand(text: string, b?: Branding): string;
|
|
49
|
+
/** fillBrand over every string in a parsed JSON value. */
|
|
50
|
+
export declare function fillBrandDeep<T>(value: T, b?: Branding): T;
|
|
51
|
+
/** The Teams manifest's developer, which a package needs. */
|
|
52
|
+
export declare function teamsDeveloper(b?: Branding): {
|
|
53
|
+
name: string;
|
|
54
|
+
websiteUrl: string;
|
|
55
|
+
privacyUrl: string;
|
|
56
|
+
termsOfUseUrl: string;
|
|
57
|
+
};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ConnectError } from "./types.js";
|
|
3
|
+
// The names this deployment shows and creates: in copy, in the connectors' steps (as
|
|
4
|
+
// {brand.*} placeholders) and in what it makes in a customer's tenant. The names it creates
|
|
5
|
+
// (mailbox group, Azure role, resource group, bot and app names) must not change once
|
|
6
|
+
// customers have made them, so an install sets them once.
|
|
7
|
+
const https = z.url({ protocol: /^https$/ });
|
|
8
|
+
// Names go into copy and into PowerShell strings, double- and single-quoted, so none of
|
|
9
|
+
// $ " ' ` { } < >.
|
|
10
|
+
const nameText = z
|
|
11
|
+
.string()
|
|
12
|
+
.trim()
|
|
13
|
+
.regex(/^[\p{L}\p{N} .,&()-]{1,80}$/u);
|
|
14
|
+
const name = (fallback) => nameText.default(fallback);
|
|
15
|
+
export const brandingSchema = z.strictObject({
|
|
16
|
+
productName: name("Enterprise Agent Connect"),
|
|
17
|
+
logoUrl: https.optional(),
|
|
18
|
+
// Prefix of what it names in a tenant (bot app `<prefix>-bot-<id>`, Azure Bot `<prefix>-<8>`).
|
|
19
|
+
resourcePrefix: z
|
|
20
|
+
.string()
|
|
21
|
+
.regex(/^[a-z][a-z0-9-]{1,20}$/)
|
|
22
|
+
.default("eac"),
|
|
23
|
+
microsoft: z
|
|
24
|
+
.strictObject({
|
|
25
|
+
appName: name("Enterprise Agent Connect"),
|
|
26
|
+
mailboxGroup: name("Agent Mailboxes"),
|
|
27
|
+
mailboxGroupAlias: z
|
|
28
|
+
.string()
|
|
29
|
+
.regex(/^[a-z0-9-]{1,64}$/)
|
|
30
|
+
.default("agent-mailboxes"),
|
|
31
|
+
botRole: name("Agent Connect bots"),
|
|
32
|
+
})
|
|
33
|
+
.default({
|
|
34
|
+
appName: "Enterprise Agent Connect",
|
|
35
|
+
mailboxGroup: "Agent Mailboxes",
|
|
36
|
+
mailboxGroupAlias: "agent-mailboxes",
|
|
37
|
+
botRole: "Agent Connect bots",
|
|
38
|
+
}),
|
|
39
|
+
teams: z
|
|
40
|
+
.strictObject({
|
|
41
|
+
resourceGroup: z
|
|
42
|
+
.string()
|
|
43
|
+
.regex(/^[A-Za-z0-9._()-]{1,90}$/)
|
|
44
|
+
.default("agent-connect"),
|
|
45
|
+
// The Teams app manifest's developer. Unset: no Teams package can be made until it is.
|
|
46
|
+
developer: z
|
|
47
|
+
.strictObject({
|
|
48
|
+
name: nameText.max(32),
|
|
49
|
+
websiteUrl: https,
|
|
50
|
+
privacyUrl: https,
|
|
51
|
+
termsOfUseUrl: https,
|
|
52
|
+
})
|
|
53
|
+
.optional(),
|
|
54
|
+
})
|
|
55
|
+
.default({ resourceGroup: "agent-connect" }),
|
|
56
|
+
});
|
|
57
|
+
export const DEFAULT_BRANDING = brandingSchema.parse({});
|
|
58
|
+
export function parseBranding(raw) {
|
|
59
|
+
const parsed = brandingSchema.safeParse(raw ?? {});
|
|
60
|
+
if (!parsed.success)
|
|
61
|
+
throw new Error(`branding: ${z.prettifyError(parsed.error)}`);
|
|
62
|
+
return parsed.data;
|
|
63
|
+
}
|
|
64
|
+
// ponytail: one branding per process (set by createAgentConnect before anything reads it);
|
|
65
|
+
// thread it through the deps if two differently branded instances must share a process.
|
|
66
|
+
let current = DEFAULT_BRANDING;
|
|
67
|
+
let set = false;
|
|
68
|
+
export const brand = () => current;
|
|
69
|
+
export function setBranding(b) {
|
|
70
|
+
if (set && JSON.stringify(b) !== JSON.stringify(current))
|
|
71
|
+
throw new Error("This process already runs with another branding");
|
|
72
|
+
current = b;
|
|
73
|
+
set = true;
|
|
74
|
+
}
|
|
75
|
+
/** Fills `{brand.a.b}` placeholders; one naming no text field of the branding throws. */
|
|
76
|
+
export function fillBrand(text, b = current) {
|
|
77
|
+
return text.replace(/\{brand\.([A-Za-z.]+)\}/g, (whole, path) => {
|
|
78
|
+
let v = b;
|
|
79
|
+
for (const part of path.split("."))
|
|
80
|
+
v = v?.[part];
|
|
81
|
+
if (typeof v !== "string")
|
|
82
|
+
throw new Error(`${whole} names no branding text`);
|
|
83
|
+
return v;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/** fillBrand over every string in a parsed JSON value. */
|
|
87
|
+
export function fillBrandDeep(value, b = current) {
|
|
88
|
+
if (typeof value === "string")
|
|
89
|
+
return fillBrand(value, b);
|
|
90
|
+
if (Array.isArray(value))
|
|
91
|
+
return value.map((v) => fillBrandDeep(v, b));
|
|
92
|
+
if (value && typeof value === "object")
|
|
93
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fillBrandDeep(v, b)]));
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
/** The Teams manifest's developer, which a package needs. */
|
|
97
|
+
export function teamsDeveloper(b = current) {
|
|
98
|
+
if (!b.teams.developer)
|
|
99
|
+
throw new ConnectError("Set branding.teams.developer (name and https website, privacy and terms addresses) to make Teams packages");
|
|
100
|
+
return b.teams.developer;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=branding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../../../../packages/connector-kit/src/branding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type NewCertificate = {
|
|
2
|
+
certificate: string;
|
|
3
|
+
privateKey: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function newCertificate(commonName: string, now?: Date): NewCertificate;
|
|
6
|
+
/** What the admin sees of a certificate: Entra lists it by its SHA-1 thumbprint. */
|
|
7
|
+
export declare function describeCertificate(pem: string): {
|
|
8
|
+
thumbprint: string;
|
|
9
|
+
expiresAt: string;
|
|
10
|
+
};
|
|
11
|
+
/** A signed client assertion (RFC 7523) for Microsoft's token endpoint, valid five minutes.
|
|
12
|
+
* Microsoft pairs the x5t#S256 header with PS256 (RSA-PSS). */
|
|
13
|
+
export declare function clientAssertion(input: {
|
|
14
|
+
clientId: string;
|
|
15
|
+
tokenUrl: string;
|
|
16
|
+
certificate: string;
|
|
17
|
+
privateKey: string;
|
|
18
|
+
now?: number;
|
|
19
|
+
}): string;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { constants, createHash, generateKeyPairSync, randomBytes, randomUUID, sign, X509Certificate, } from "node:crypto";
|
|
2
|
+
// A key pair the service makes for one connection: the private key is sealed with the connection's
|
|
3
|
+
// credential and never leaves the service; the self-signed certificate is what the admin
|
|
4
|
+
// uploads to their own app registration. Node can parse X.509 but not create it, so the
|
|
5
|
+
// certificate's DER is written here (RFC 5280, no extensions).
|
|
6
|
+
const VALID_DAYS = 730;
|
|
7
|
+
function der(tag, ...parts) {
|
|
8
|
+
const body = Buffer.concat(parts);
|
|
9
|
+
let length;
|
|
10
|
+
if (body.length < 0x80)
|
|
11
|
+
length = Buffer.from([body.length]);
|
|
12
|
+
else {
|
|
13
|
+
const bytes = [];
|
|
14
|
+
for (let n = body.length; n > 0; n = Math.floor(n / 256))
|
|
15
|
+
bytes.unshift(n % 256);
|
|
16
|
+
length = Buffer.from([0x80 | bytes.length, ...bytes]);
|
|
17
|
+
}
|
|
18
|
+
return Buffer.concat([Buffer.from([tag]), length, body]);
|
|
19
|
+
}
|
|
20
|
+
const seq = (...parts) => der(0x30, ...parts);
|
|
21
|
+
function oid(dotted) {
|
|
22
|
+
const [a, b, ...rest] = dotted.split(".").map(Number);
|
|
23
|
+
const bytes = [40 * a + b];
|
|
24
|
+
for (const n of rest) {
|
|
25
|
+
const chunk = [n & 0x7f];
|
|
26
|
+
for (let v = n >> 7; v > 0; v >>= 7)
|
|
27
|
+
chunk.unshift((v & 0x7f) | 0x80);
|
|
28
|
+
bytes.push(...chunk);
|
|
29
|
+
}
|
|
30
|
+
return der(0x06, Buffer.from(bytes));
|
|
31
|
+
}
|
|
32
|
+
// UTCTime, YYMMDDHHMMSSZ: valid for dates before 2050.
|
|
33
|
+
const utcTime = (d) => der(0x17, Buffer.from(d.toISOString().replace(/[-:T]/g, "").slice(2, 14) + "Z"));
|
|
34
|
+
const name = (cn) => seq(der(0x31, seq(oid("2.5.4.3"), der(0x0c, Buffer.from(cn, "utf8")))));
|
|
35
|
+
export function newCertificate(commonName, now = new Date()) {
|
|
36
|
+
const { privateKey, publicKey } = generateKeyPairSync("rsa", { modulusLength: 2048 });
|
|
37
|
+
const serial = randomBytes(16);
|
|
38
|
+
serial[0] = (serial[0] & 0x7f) | 0x01;
|
|
39
|
+
const sha256WithRsa = seq(oid("1.2.840.113549.1.1.11"), der(0x05));
|
|
40
|
+
const tbs = seq(der(0xa0, der(0x02, Buffer.from([2]))), der(0x02, serial), sha256WithRsa, name(commonName), seq(utcTime(now), utcTime(new Date(now.getTime() + VALID_DAYS * 86_400_000))), name(commonName), publicKey.export({ type: "spki", format: "der" }));
|
|
41
|
+
const signature = sign("sha256", tbs, privateKey);
|
|
42
|
+
const cert = seq(tbs, sha256WithRsa, der(0x03, Buffer.from([0]), signature));
|
|
43
|
+
const lines = cert.toString("base64").match(/.{1,64}/g);
|
|
44
|
+
return {
|
|
45
|
+
certificate: `-----BEGIN CERTIFICATE-----\n${lines.join("\n")}\n-----END CERTIFICATE-----\n`,
|
|
46
|
+
privateKey: privateKey.export({ type: "pkcs8", format: "pem" }).toString(),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** What the admin sees of a certificate: Entra lists it by its SHA-1 thumbprint. */
|
|
50
|
+
export function describeCertificate(pem) {
|
|
51
|
+
const cert = new X509Certificate(pem);
|
|
52
|
+
return {
|
|
53
|
+
thumbprint: cert.fingerprint.replaceAll(":", ""),
|
|
54
|
+
expiresAt: new Date(cert.validTo).toISOString(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const b64url = (v) => Buffer.from(v).toString("base64url");
|
|
58
|
+
/** A signed client assertion (RFC 7523) for Microsoft's token endpoint, valid five minutes.
|
|
59
|
+
* Microsoft pairs the x5t#S256 header with PS256 (RSA-PSS). */
|
|
60
|
+
export function clientAssertion(input) {
|
|
61
|
+
const raw = new X509Certificate(input.certificate).raw;
|
|
62
|
+
const now = Math.floor((input.now ?? Date.now()) / 1000);
|
|
63
|
+
const header = b64url(JSON.stringify({
|
|
64
|
+
alg: "PS256",
|
|
65
|
+
typ: "JWT",
|
|
66
|
+
"x5t#S256": b64url(createHash("sha256").update(raw).digest()),
|
|
67
|
+
}));
|
|
68
|
+
const payload = b64url(JSON.stringify({
|
|
69
|
+
aud: input.tokenUrl,
|
|
70
|
+
iss: input.clientId,
|
|
71
|
+
sub: input.clientId,
|
|
72
|
+
jti: randomUUID(),
|
|
73
|
+
nbf: now,
|
|
74
|
+
iat: now,
|
|
75
|
+
exp: now + 300,
|
|
76
|
+
}));
|
|
77
|
+
const signature = sign("sha256", Buffer.from(`${header}.${payload}`), {
|
|
78
|
+
key: input.privateKey,
|
|
79
|
+
padding: constants.RSA_PKCS1_PSS_PADDING,
|
|
80
|
+
saltLength: constants.RSA_PSS_SALTLEN_DIGEST,
|
|
81
|
+
});
|
|
82
|
+
return `${header}.${payload}.${b64url(signature)}`;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=certificate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"certificate.js","sourceRoot":"","sources":["../../../../packages/connector-kit/src/certificate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CallToolResult, McpServer } from "@modelcontextprotocol/server";
|
|
2
|
+
import type { Limits } from "../../server/src/store.js";
|
|
3
|
+
import type { TeamsAccess } from "../../server/src/teams/runtime.js";
|
|
4
|
+
import type { VendorRequest, VendorResponse } from "./types.js";
|
|
5
|
+
export type ToolContext = {
|
|
6
|
+
limits: Limits;
|
|
7
|
+
/** The connection's settings, e.g. the sites it was connected with. */
|
|
8
|
+
config: Record<string, string>;
|
|
9
|
+
call(request: VendorRequest): Promise<VendorResponse>;
|
|
10
|
+
/** Per tool: what to add to a 403 from the app (its capability's `forbidden`). */
|
|
11
|
+
forbidden?: Record<string, string>;
|
|
12
|
+
/** Teams only: the agent's own bot. */
|
|
13
|
+
teams?: TeamsAccess;
|
|
14
|
+
audit(entry: {
|
|
15
|
+
tool: string;
|
|
16
|
+
target: string | null;
|
|
17
|
+
decision: "allowed" | "denied" | "failed";
|
|
18
|
+
reason: string | null;
|
|
19
|
+
vendorStatus: number | null;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
export type Toolset = {
|
|
23
|
+
names: readonly string[];
|
|
24
|
+
register(server: McpServer, ctx: ToolContext, allowed: ReadonlySet<string>): void;
|
|
25
|
+
};
|
|
26
|
+
/** One app's tools from several sets, e.g. SharePoint's files and spreadsheets. */
|
|
27
|
+
export declare const toolsets: (...sets: Toolset[]) => Toolset;
|
|
28
|
+
export declare class Denied extends Error {
|
|
29
|
+
}
|
|
30
|
+
export declare class VendorFailed extends Error {
|
|
31
|
+
readonly status: number;
|
|
32
|
+
readonly hintTool?: string | undefined;
|
|
33
|
+
constructor(status: number, message: string, hintTool?: string | undefined);
|
|
34
|
+
}
|
|
35
|
+
export declare function listLimit(limits: Limits, id: string): string[] | null;
|
|
36
|
+
export declare function mapLimit(limits: Limits, id: string): Record<string, string> | null;
|
|
37
|
+
export declare function textLimit(limits: Limits, id: string): string | null;
|
|
38
|
+
export declare const argumentsTarget: (args: unknown) => string | null;
|
|
39
|
+
export declare const json: (data: unknown) => CallToolResult;
|
|
40
|
+
export declare function audited(ctx: ToolContext, tool: string, target: string | null, run: (vendorStatus: (status: number) => void, retarget: (sent: string) => void) => Promise<CallToolResult>): Promise<CallToolResult>;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/** One app's tools from several sets, e.g. SharePoint's files and spreadsheets. */
|
|
2
|
+
export const toolsets = (...sets) => ({
|
|
3
|
+
names: sets.flatMap((s) => s.names),
|
|
4
|
+
register: (server, ctx, allowed) => sets.forEach((s) => s.register(server, ctx, allowed)),
|
|
5
|
+
});
|
|
6
|
+
// Refusal of a call the grant does not cover. Its message is returned to the agent.
|
|
7
|
+
export class Denied extends Error {
|
|
8
|
+
}
|
|
9
|
+
// Non-2xx answer from the app. Its message is returned to the agent. `hintTool`: a call a tool
|
|
10
|
+
// makes under another capability (always-on reads, say) names a tool of that capability, whose
|
|
11
|
+
// `forbidden` is then the hint added to a 403.
|
|
12
|
+
export class VendorFailed extends Error {
|
|
13
|
+
status;
|
|
14
|
+
hintTool;
|
|
15
|
+
constructor(status, message, hintTool) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.status = status;
|
|
18
|
+
this.hintTool = hintTool;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function listLimit(limits, id) {
|
|
22
|
+
const value = limits[id];
|
|
23
|
+
if (value === undefined)
|
|
24
|
+
return null;
|
|
25
|
+
if (!Array.isArray(value))
|
|
26
|
+
throw new Error(`Limit ${id} must be a list`);
|
|
27
|
+
return value.length ? value : null;
|
|
28
|
+
}
|
|
29
|
+
export function mapLimit(limits, id) {
|
|
30
|
+
const value = limits[id];
|
|
31
|
+
if (value === undefined)
|
|
32
|
+
return null;
|
|
33
|
+
if (typeof value !== "object" || Array.isArray(value))
|
|
34
|
+
throw new Error(`Limit ${id} must be a map`);
|
|
35
|
+
return Object.keys(value).length ? value : null;
|
|
36
|
+
}
|
|
37
|
+
export function textLimit(limits, id) {
|
|
38
|
+
const value = limits[id];
|
|
39
|
+
if (value === undefined || value === "")
|
|
40
|
+
return null;
|
|
41
|
+
if (typeof value !== "string")
|
|
42
|
+
throw new Error(`Limit ${id} must be text`);
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
// The audit target of a call refused before any tool ran: what it was sent, shortened.
|
|
46
|
+
export const argumentsTarget = (args) => args === undefined ? null : JSON.stringify(args).slice(0, 300);
|
|
47
|
+
export const json = (data) => ({
|
|
48
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
49
|
+
});
|
|
50
|
+
// Runs one tool call and writes its audit row whatever the outcome. `retarget` replaces the
|
|
51
|
+
// audited target with what was actually sent, e.g. the project-scoped JQL.
|
|
52
|
+
export async function audited(ctx, tool, target, run) {
|
|
53
|
+
let status = null;
|
|
54
|
+
const fail = (text) => ({
|
|
55
|
+
isError: true,
|
|
56
|
+
content: [{ type: "text", text }],
|
|
57
|
+
});
|
|
58
|
+
let result;
|
|
59
|
+
try {
|
|
60
|
+
result = await run((s) => (status = s), (sent) => (target = sent));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error instanceof Denied) {
|
|
64
|
+
await ctx.audit({
|
|
65
|
+
tool,
|
|
66
|
+
target,
|
|
67
|
+
decision: "denied",
|
|
68
|
+
reason: error.message,
|
|
69
|
+
// Set when the app answered and the answer was refused, e.g. by an answer limit.
|
|
70
|
+
vendorStatus: status,
|
|
71
|
+
});
|
|
72
|
+
return fail(error.message);
|
|
73
|
+
}
|
|
74
|
+
if (error instanceof VendorFailed) {
|
|
75
|
+
const hint = error.status === 403 ? ctx.forbidden?.[error.hintTool ?? tool] : undefined;
|
|
76
|
+
const message = hint ? `${error.message.replace(/\.$/, "")}. ${hint}` : error.message;
|
|
77
|
+
await ctx.audit({
|
|
78
|
+
tool,
|
|
79
|
+
target,
|
|
80
|
+
decision: "failed",
|
|
81
|
+
reason: message.slice(0, 500),
|
|
82
|
+
vendorStatus: error.status,
|
|
83
|
+
});
|
|
84
|
+
return fail(message);
|
|
85
|
+
}
|
|
86
|
+
// Internal details (database, keys, config) stay in the log, not with the agent.
|
|
87
|
+
console.error(`[agent-connect] ${tool} failed`, error);
|
|
88
|
+
await ctx.audit({
|
|
89
|
+
tool,
|
|
90
|
+
target,
|
|
91
|
+
decision: "failed",
|
|
92
|
+
reason: "Internal error",
|
|
93
|
+
vendorStatus: status,
|
|
94
|
+
});
|
|
95
|
+
return fail("The call failed. Try again later.");
|
|
96
|
+
}
|
|
97
|
+
// The call already happened (mail sent, record deleted): a failed audit write must not
|
|
98
|
+
// tell the agent to repeat it.
|
|
99
|
+
try {
|
|
100
|
+
await ctx.audit({ tool, target, decision: "allowed", reason: null, vendorStatus: status });
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error(`[agent-connect] ${tool} audit write failed after a completed call`, error);
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../packages/connector-kit/src/common.ts"],"names":[],"mappings":"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"}
|