@arbium/enterprise-agent-connect 0.0.0-stage → 0.1.1
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 +117 -2
- package/dist/connectors/dell-techdirect/connector.json +39 -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.js +49 -0
- package/dist/connectors/dell-techdirect/tools.js.map +1 -0
- package/dist/connectors/dell-techdirect/vendor.js +57 -0
- package/dist/connectors/dell-techdirect/vendor.js.map +1 -0
- package/dist/connectors/entra/connector.json +85 -0
- package/dist/connectors/entra/index.js +4 -0
- package/dist/connectors/entra/index.js.map +1 -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.js +7 -0
- package/dist/connectors/fedex/index.js.map +1 -0
- package/dist/connectors/fedex/tools.js +152 -0
- package/dist/connectors/fedex/tools.js.map +1 -0
- package/dist/connectors/fedex/vendor.js +98 -0
- package/dist/connectors/fedex/vendor.js.map +1 -0
- package/dist/connectors/http/index.js +235 -0
- package/dist/connectors/http/index.js.map +1 -0
- package/dist/connectors/intune/connector.json +106 -0
- package/dist/connectors/intune/index.js +4 -0
- package/dist/connectors/intune/index.js.map +1 -0
- package/dist/connectors/intune/tools.js +416 -0
- package/dist/connectors/intune/tools.js.map +1 -0
- package/dist/connectors/jira/connector.json +129 -0
- package/dist/connectors/jira/index.js +7 -0
- package/dist/connectors/jira/index.js.map +1 -0
- package/dist/connectors/jira/jql.js +67 -0
- package/dist/connectors/jira/jql.js.map +1 -0
- package/dist/connectors/jira/tools.js +464 -0
- package/dist/connectors/jira/tools.js.map +1 -0
- package/dist/connectors/jira/vendor.js +94 -0
- package/dist/connectors/jira/vendor.js.map +1 -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/outlook-calendar/connector.json +136 -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.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.js +4 -0
- package/dist/connectors/outlook-mail/index.js.map +1 -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.js +7 -0
- package/dist/connectors/salesforce/index.js.map +1 -0
- package/dist/connectors/salesforce/soql.js +60 -0
- package/dist/connectors/salesforce/soql.js.map +1 -0
- package/dist/connectors/salesforce/tools.js +234 -0
- package/dist/connectors/salesforce/tools.js.map +1 -0
- package/dist/connectors/salesforce/vendor.js +107 -0
- package/dist/connectors/salesforce/vendor.js.map +1 -0
- package/dist/connectors/sharepoint-files/connector.json +194 -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.js +12 -0
- package/dist/connectors/sharepoint-files/index.js.map +1 -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.js +167 -0
- package/dist/connectors/sharepoint-files/vendor.js.map +1 -0
- package/dist/connectors/teams/connector.json +298 -0
- package/dist/connectors/teams/index.js +5 -0
- package/dist/connectors/teams/index.js.map +1 -0
- package/dist/connectors/teams/tools.js +391 -0
- package/dist/connectors/teams/tools.js.map +1 -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.js +84 -0
- package/dist/packages/connector-kit/src/certificate.js.map +1 -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.js +492 -0
- package/dist/packages/connector-kit/src/connector.js.map +1 -0
- package/dist/packages/connector-kit/src/oauth.js +79 -0
- package/dist/packages/connector-kit/src/oauth.js.map +1 -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/rollback/to-legacy.sql +87 -0
- package/dist/packages/server/src/api.js +684 -0
- package/dist/packages/server/src/api.js.map +1 -0
- package/dist/packages/server/src/app.js +444 -0
- package/dist/packages/server/src/app.js.map +1 -0
- package/dist/packages/server/src/builtin.js +24 -0
- package/dist/packages/server/src/builtin.js.map +1 -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/index.js +129 -0
- package/dist/packages/server/src/index.js.map +1 -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.js +101 -0
- package/dist/packages/server/src/openapi.js.map +1 -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.js +69 -0
- package/dist/packages/server/src/server.js.map +1 -0
- package/dist/packages/server/src/service.js +908 -0
- package/dist/packages/server/src/service.js.map +1 -0
- package/dist/packages/server/src/store.js +411 -0
- package/dist/packages/server/src/store.js.map +1 -0
- package/dist/packages/server/src/teams/activity.js +187 -0
- package/dist/packages/server/src/teams/activity.js.map +1 -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.js +118 -0
- package/dist/packages/server/src/teams/approval.js.map +1 -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.js +165 -0
- package/dist/packages/server/src/teams/claude.js.map +1 -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.js +319 -0
- package/dist/packages/server/src/teams/package.js.map +1 -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.js +143 -0
- package/dist/packages/server/src/teams/runner.js.map +1 -0
- package/dist/packages/server/src/teams/runtime.js +701 -0
- package/dist/packages/server/src/teams/runtime.js.map +1 -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 +42 -4
|
@@ -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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"}
|
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { fillBrandDeep } from "./branding.js";
|
|
4
|
+
// A connector describes one app agents can use: how an admin connects it, the capabilities
|
|
5
|
+
// they can grant (each a set of tools), the value limits a grant can carry, and how a
|
|
6
|
+
// connection is checked. Each app is a folder in connectors/: its connector.json, and the
|
|
7
|
+
// ConnectorModule (index.ts) with its vendor client and tools.
|
|
8
|
+
const text = z.string().min(1);
|
|
9
|
+
const slug = z.string().regex(/^[a-z][a-z0-9_]*$/);
|
|
10
|
+
const settingSchema = z
|
|
11
|
+
.object({
|
|
12
|
+
id: z.string().regex(/^[a-z][A-Za-z]+$/),
|
|
13
|
+
label: text,
|
|
14
|
+
help: text.optional(),
|
|
15
|
+
placeholder: text.optional(),
|
|
16
|
+
// The whole value must match.
|
|
17
|
+
pattern: text,
|
|
18
|
+
})
|
|
19
|
+
.strict();
|
|
20
|
+
// One option of a choice field (`options`), e.g. add_to_teams = on.
|
|
21
|
+
const chosenSchema = z.object({ field: slug, value: slug }).strict();
|
|
22
|
+
const stepSchema = z
|
|
23
|
+
.object({
|
|
24
|
+
title: text,
|
|
25
|
+
body: text,
|
|
26
|
+
link: z.object({ label: text, href: z.url() }).strict().optional(),
|
|
27
|
+
// A line containing {scope} repeats once per scope; {scopes} becomes them space-separated.
|
|
28
|
+
copy: z.array(text).optional(),
|
|
29
|
+
// The shell `copy` runs in, named above the commands.
|
|
30
|
+
shell: z.enum(["bash", "powershell"]).optional(),
|
|
31
|
+
// Lists the in-app permissions the ticked capabilities need, e.g. Jira project permissions.
|
|
32
|
+
permissions: z.boolean().optional(),
|
|
33
|
+
// Shows the certificate the service made for the provider connection, to download.
|
|
34
|
+
certificate: z.boolean().optional(),
|
|
35
|
+
// The same step in the vendor's admin portals, one screen or choice per item. A step with
|
|
36
|
+
// both `click` and `copy` is offered both ways.
|
|
37
|
+
click: z.array(text).min(1).optional(),
|
|
38
|
+
// The vendor has no portal page for this step, only commands (`copy`): the admin page says
|
|
39
|
+
// so in place of clicks. Never with `click`, so a step cannot pass as clickable by a
|
|
40
|
+
// "use the commands" line.
|
|
41
|
+
clickUnavailable: z.literal(true).optional(),
|
|
42
|
+
// A site grant step shown only while the site role the ceiling needs is this one, e.g.
|
|
43
|
+
// raising a read grant to write.
|
|
44
|
+
siteRole: z.enum(["read", "write"]).optional(),
|
|
45
|
+
// Shows the live check of the agent's own address (`agentAccess`) after this step.
|
|
46
|
+
agentCheck: z.boolean().optional(),
|
|
47
|
+
// The service cannot check this step live, so the admin marks it done. Steps of different apps
|
|
48
|
+
// with the same id share that mark (e.g. one group both Outlook apps use).
|
|
49
|
+
confirm: z
|
|
50
|
+
.string()
|
|
51
|
+
.regex(/^[a-z0-9-]+$/)
|
|
52
|
+
.optional(),
|
|
53
|
+
// Checked live by the app's own setup check under this id (e.g. Teams' Azure role), not by
|
|
54
|
+
// the permissions check.
|
|
55
|
+
live: z
|
|
56
|
+
.string()
|
|
57
|
+
.regex(/^[a-z0-9-]+$/)
|
|
58
|
+
.optional(),
|
|
59
|
+
// Values the admin enters at this step, kept in the provider connection's config under
|
|
60
|
+
// their ids and filled into steps as {id} (e.g. the Azure subscription for Teams bots).
|
|
61
|
+
settings: z.array(settingSchema).min(1).optional(),
|
|
62
|
+
// Shown, and holding back turning on, only while this option is chosen (e.g. Teams' Azure
|
|
63
|
+
// steps only while the service makes the bots).
|
|
64
|
+
option: chosenSchema.optional(),
|
|
65
|
+
})
|
|
66
|
+
.strict();
|
|
67
|
+
// A step of adding one more agent on a provider's page, shown while one of `apps` is on.
|
|
68
|
+
const agentStepSchema = stepSchema
|
|
69
|
+
.extend({ apps: z.array(z.string().regex(/^[a-z0-9-]+$/)).min(1) })
|
|
70
|
+
.strict();
|
|
71
|
+
const clickRule = [
|
|
72
|
+
(s) => !s.clickUnavailable || (!s.click && Boolean(s.copy)),
|
|
73
|
+
{ message: "A step with clickUnavailable has commands (copy) and no click" },
|
|
74
|
+
];
|
|
75
|
+
const step = stepSchema.refine(...clickRule);
|
|
76
|
+
const agentStep = agentStepSchema.refine(...clickRule);
|
|
77
|
+
// A field with `options` is a choice (the first is the default), stored in the app's config
|
|
78
|
+
// under its id. An option's `scopes` are vendor permissions the app then needs too, e.g.
|
|
79
|
+
// reading every site.
|
|
80
|
+
const optionSchema = z
|
|
81
|
+
.object({ value: slug, label: text, description: text, scopes: z.array(text).optional() })
|
|
82
|
+
.strict();
|
|
83
|
+
const fieldSchema = z
|
|
84
|
+
.object({
|
|
85
|
+
id: slug,
|
|
86
|
+
label: text,
|
|
87
|
+
help: text.optional(),
|
|
88
|
+
placeholder: text.optional(),
|
|
89
|
+
secret: z.boolean(),
|
|
90
|
+
options: z.array(optionSchema).min(2).optional(),
|
|
91
|
+
// Asked only while an earlier choice is this option; otherwise its first option holds.
|
|
92
|
+
requires: chosenSchema.optional(),
|
|
93
|
+
})
|
|
94
|
+
.strict();
|
|
95
|
+
// "map": one optional value per value of the list limit `keys`, e.g. a folder per site.
|
|
96
|
+
const limitSchema = z
|
|
97
|
+
.object({
|
|
98
|
+
id: slug,
|
|
99
|
+
label: text,
|
|
100
|
+
help: text,
|
|
101
|
+
kind: z.enum(["list", "text", "map"]),
|
|
102
|
+
required: z.boolean(),
|
|
103
|
+
// Each value must match this, e.g. a Jira project key or a mailbox address.
|
|
104
|
+
pattern: z.string().optional(),
|
|
105
|
+
keys: slug.optional(),
|
|
106
|
+
})
|
|
107
|
+
.strict()
|
|
108
|
+
.refine((l) => (l.kind === "map") === Boolean(l.keys), {
|
|
109
|
+
message: "A map limit names the list limit it is keyed by (keys), and only it",
|
|
110
|
+
});
|
|
111
|
+
const httpProbeSchema = z
|
|
112
|
+
.object({
|
|
113
|
+
method: z.enum(["GET", "POST"]),
|
|
114
|
+
path: z.string().startsWith("/"),
|
|
115
|
+
label: text,
|
|
116
|
+
show: text,
|
|
117
|
+
// Keeps only list items whose fields equal these values, e.g. objects agents can query.
|
|
118
|
+
match: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
|
|
119
|
+
body: z.record(z.string(), z.unknown()).optional(),
|
|
120
|
+
// Shown to the admin when the probe finds nothing, e.g. a missing project permission.
|
|
121
|
+
ifEmpty: text.optional(),
|
|
122
|
+
})
|
|
123
|
+
.strict();
|
|
124
|
+
// A check no single API call answers, e.g. the permissions inside a token. The vendor client
|
|
125
|
+
// implements it under this name (Vendor.checks).
|
|
126
|
+
const vendorProbeSchema = z
|
|
127
|
+
.object({
|
|
128
|
+
label: text,
|
|
129
|
+
check: slug,
|
|
130
|
+
ifEmpty: text.optional(),
|
|
131
|
+
})
|
|
132
|
+
.strict();
|
|
133
|
+
const probeSchema = z.union([httpProbeSchema, vendorProbeSchema]);
|
|
134
|
+
// An app described entirely here, e.g. a company's internal REST API: the generic http module
|
|
135
|
+
// (connectors/http) runs it, so it needs no code. Auth values are the ids of connect form fields.
|
|
136
|
+
const httpAuthSchema = z.discriminatedUnion("type", [
|
|
137
|
+
z
|
|
138
|
+
.object({ type: z.literal("header"), header: z.string().regex(/^[A-Za-z0-9-]+$/), value: slug })
|
|
139
|
+
.strict(),
|
|
140
|
+
z.object({ type: z.literal("bearer"), token: slug }).strict(),
|
|
141
|
+
z.object({ type: z.literal("basic"), username: slug, password: slug }).strict(),
|
|
142
|
+
z
|
|
143
|
+
.object({
|
|
144
|
+
type: z.literal("oauth2"),
|
|
145
|
+
tokenUrl: z.url({ protocol: /^https?$/ }),
|
|
146
|
+
clientId: slug,
|
|
147
|
+
clientSecret: slug,
|
|
148
|
+
})
|
|
149
|
+
.strict(),
|
|
150
|
+
]);
|
|
151
|
+
const httpParamSchema = z
|
|
152
|
+
.object({
|
|
153
|
+
type: z.enum(["string", "number", "integer", "boolean"]),
|
|
154
|
+
description: text,
|
|
155
|
+
// Where it goes; a {name} in the path template is always "path".
|
|
156
|
+
in: z.enum(["path", "query", "body"]),
|
|
157
|
+
required: z.boolean().default(true),
|
|
158
|
+
// The value must be one of the agent's values of this list limit, while it has any.
|
|
159
|
+
limit: slug.optional(),
|
|
160
|
+
})
|
|
161
|
+
.strict();
|
|
162
|
+
const httpToolSchema = z
|
|
163
|
+
.object({
|
|
164
|
+
name: slug,
|
|
165
|
+
description: text,
|
|
166
|
+
method: z.enum(["GET", "POST", "PUT", "PATCH", "DELETE"]),
|
|
167
|
+
// Under baseUrl, with {param} for path params, e.g. /orders/{id}.
|
|
168
|
+
path: z.string().regex(/^\/[^?#]*$/),
|
|
169
|
+
params: z.record(slug, httpParamSchema).default({}),
|
|
170
|
+
// Deletes or overwrites: its capability must be destructive. DELETE always is.
|
|
171
|
+
destructive: z.boolean().default(false),
|
|
172
|
+
// Checked in the answer, for calls whose params cannot be limited (e.g. an order by id):
|
|
173
|
+
// while the agent has values of `limit`, the answer's `field` (a dot path; every item of a
|
|
174
|
+
// list) must be one of them, else nothing is returned. A missing field is refused.
|
|
175
|
+
answerLimits: z
|
|
176
|
+
.array(z
|
|
177
|
+
.object({ field: z.string().regex(/^[A-Za-z0-9_]+(\.[A-Za-z0-9_]+)*$/), limit: slug })
|
|
178
|
+
.strict())
|
|
179
|
+
.default([]),
|
|
180
|
+
})
|
|
181
|
+
.strict()
|
|
182
|
+
.refine((t) => {
|
|
183
|
+
const inPath = [...t.path.matchAll(/\{([a-z][a-z0-9_]*)\}/g)].map((m) => m[1]);
|
|
184
|
+
const declared = Object.entries(t.params).filter(([, p]) => p.in === "path");
|
|
185
|
+
return (inPath.every((n) => t.params[n]?.in === "path" && t.params[n].required) &&
|
|
186
|
+
declared.every(([n]) => inPath.includes(n)));
|
|
187
|
+
}, { message: "Each {param} in a tool's path is a required path param, and only those" })
|
|
188
|
+
.refine((t) => !Object.values(t.params).some((p) => p.in === "body") || t.method !== "GET", {
|
|
189
|
+
message: "A GET tool has no body params",
|
|
190
|
+
})
|
|
191
|
+
// Checked after the call, so only for reads: a write would already have happened.
|
|
192
|
+
.refine((t) => !t.answerLimits.length || t.method === "GET", {
|
|
193
|
+
message: "answerLimits are for GET tools only",
|
|
194
|
+
});
|
|
195
|
+
const httpSchema = z
|
|
196
|
+
.object({
|
|
197
|
+
// Every call goes to this origin, under this path, and nowhere else: redirects are refused.
|
|
198
|
+
baseUrl: z.url({ protocol: /^https?$/ }).refine((u) => !/[?#]/.test(u), "No query or fragment"),
|
|
199
|
+
auth: httpAuthSchema,
|
|
200
|
+
tools: z.array(httpToolSchema).min(1),
|
|
201
|
+
// Plain http for baseUrl and the token URL, e.g. an app inside the cluster. Off by default.
|
|
202
|
+
allowInsecureHttp: z.boolean().default(false),
|
|
203
|
+
})
|
|
204
|
+
.strict()
|
|
205
|
+
.refine((h) => h.allowInsecureHttp ||
|
|
206
|
+
[h.baseUrl, ...(h.auth.type === "oauth2" ? [h.auth.tokenUrl] : [])].every((u) => u.startsWith("https://")), { message: "baseUrl and tokenUrl must be https unless allowInsecureHttp is true" });
|
|
207
|
+
export const connectorSchema = z
|
|
208
|
+
.object({
|
|
209
|
+
id: z.string().regex(/^[a-z0-9-]+$/),
|
|
210
|
+
name: text,
|
|
211
|
+
description: text,
|
|
212
|
+
// A path under the admin app's public folder.
|
|
213
|
+
logo: z.string().regex(/^\/brand\/[a-z0-9/-]+\.svg$/),
|
|
214
|
+
identity: text,
|
|
215
|
+
// "agentBot": calls go out as the agent's own identity (its Teams bot), not the provider's
|
|
216
|
+
// shared sign-in. A grant only gives tools once that agent has a connected bot.
|
|
217
|
+
signsInAs: z.enum(["agentBot"]).optional(),
|
|
218
|
+
// A provider connection (providers/<id>.json) this app signs in through, shared with the
|
|
219
|
+
// provider's other apps: its credentials are entered once, not per app.
|
|
220
|
+
provider: z
|
|
221
|
+
.string()
|
|
222
|
+
.regex(/^[a-z0-9-]+$/)
|
|
223
|
+
.optional(),
|
|
224
|
+
// Position among its provider's apps on the Integrations tab, where they are grouped.
|
|
225
|
+
order: z.number().int().optional(),
|
|
226
|
+
connectionKind: z.enum(["guided"]),
|
|
227
|
+
// The connection config value naming the account reached (site, org, tenant). Agents'
|
|
228
|
+
// grants are cleared when a reconnect reaches a different one.
|
|
229
|
+
accountKey: z.string().regex(/^[A-Za-z]+$/),
|
|
230
|
+
// Vendor scopes every ceiling needs, whatever is ticked (e.g. what adding agents' Teams
|
|
231
|
+
// bots takes), filled into {scope}/{scopes} with the capabilities' own.
|
|
232
|
+
scopes: z.array(text).optional(),
|
|
233
|
+
setup: z.array(step),
|
|
234
|
+
afterConnect: z.array(step),
|
|
235
|
+
fields: z.array(fieldSchema),
|
|
236
|
+
capabilities: z
|
|
237
|
+
.array(z
|
|
238
|
+
.object({
|
|
239
|
+
id: slug,
|
|
240
|
+
label: text,
|
|
241
|
+
description: text,
|
|
242
|
+
// Always on: every connection and every agent has it.
|
|
243
|
+
required: z.boolean().default(false),
|
|
244
|
+
// Off unless the admin confirms a warning.
|
|
245
|
+
destructive: z.boolean().default(false),
|
|
246
|
+
// Spends money on the account (e.g. buys shipping labels): shown as that instead
|
|
247
|
+
// of "Deletes data". Destructive too, so it still asks first.
|
|
248
|
+
costs: z.boolean().optional(),
|
|
249
|
+
// Vendor scopes or roles, filled into {scope}/{scopes} in setup steps.
|
|
250
|
+
scopes: z.array(text),
|
|
251
|
+
// The permissions a provider's access token must carry for this capability, when
|
|
252
|
+
// they are not `scopes` (e.g. mail scopes are Exchange roles, not token roles).
|
|
253
|
+
roles: z.array(text).optional(),
|
|
254
|
+
// Permissions granted inside the app, listed by steps with `permissions`.
|
|
255
|
+
permissions: z.array(text),
|
|
256
|
+
// Values for {name} placeholders in setup steps while this capability is ticked;
|
|
257
|
+
// a later ticked capability overrides an earlier one (e.g. site role read → write).
|
|
258
|
+
fill: z.record(z.string().regex(/^[a-z_]+$/), text).optional(),
|
|
259
|
+
// A caution shown with the checkbox, e.g. that it reaches the whole organization.
|
|
260
|
+
note: text.optional(),
|
|
261
|
+
// Added to the agent's error when the app answers 403 to one of its tools: what
|
|
262
|
+
// Microsoft (or the vendor) still needs, with {scopes} filled.
|
|
263
|
+
forbidden: text.optional(),
|
|
264
|
+
// Its answers use the organization's Claude API key, a setup step while ticked.
|
|
265
|
+
claudeKey: z.boolean().optional(),
|
|
266
|
+
tools: z.array(slug).min(1),
|
|
267
|
+
})
|
|
268
|
+
.strict()
|
|
269
|
+
.refine((c) => !(c.required && c.destructive), {
|
|
270
|
+
message: "A required capability cannot be destructive",
|
|
271
|
+
})
|
|
272
|
+
.refine((c) => !c.costs || c.destructive, {
|
|
273
|
+
message: "A capability that spends money must be destructive, so it asks first",
|
|
274
|
+
}))
|
|
275
|
+
.min(1),
|
|
276
|
+
limits: z.array(limitSchema),
|
|
277
|
+
// Sites the admin adds one at a time after connecting (config.sites), each given to the
|
|
278
|
+
// app outside the service. `grant`: steps showing how, with {site}, {siteHost} and {sitePath}
|
|
279
|
+
// filled per site; `request`: a note to send IT asking for it.
|
|
280
|
+
// `write`: the capabilities that need write access to each site, so Check access also
|
|
281
|
+
// proves the app can change files there while one of them is in the ceiling.
|
|
282
|
+
siteAccess: z
|
|
283
|
+
.object({
|
|
284
|
+
grant: z.array(step).min(1),
|
|
285
|
+
request: text,
|
|
286
|
+
write: z.array(slug).default([]),
|
|
287
|
+
})
|
|
288
|
+
.strict()
|
|
289
|
+
.optional(),
|
|
290
|
+
// Each agent's own address in this app (e.g. its mailbox), held in the text limit `limit`.
|
|
291
|
+
// `path` (with {value}) is read with the app's sign-in to show whether the app can reach
|
|
292
|
+
// it yet; `label` names that check; the messages answer 2xx, 401/403, 404.
|
|
293
|
+
agentAccess: z
|
|
294
|
+
.object({
|
|
295
|
+
limit: slug,
|
|
296
|
+
label: text,
|
|
297
|
+
path: z.string().startsWith("/").includes("{value}"),
|
|
298
|
+
granted: text,
|
|
299
|
+
notGranted: text,
|
|
300
|
+
notFound: text,
|
|
301
|
+
// Per capability: a call that proves the app may also do that there, changing
|
|
302
|
+
// nothing (Exchange refuses a missing role with 401/403 before reading the body).
|
|
303
|
+
// `allowed`: the statuses that mean it may. `missing` names those it may not yet,
|
|
304
|
+
// {missing} filled with their labels and roles.
|
|
305
|
+
probes: z
|
|
306
|
+
.record(slug, z
|
|
307
|
+
.object({
|
|
308
|
+
method: z.enum(["GET", "POST", "PATCH"]),
|
|
309
|
+
path: z.string().startsWith("/").includes("{value}"),
|
|
310
|
+
body: z.unknown().optional(),
|
|
311
|
+
allowed: z.array(z.number().int()).min(1),
|
|
312
|
+
})
|
|
313
|
+
.strict())
|
|
314
|
+
.default({}),
|
|
315
|
+
missing: text.optional(),
|
|
316
|
+
})
|
|
317
|
+
.strict()
|
|
318
|
+
.optional(),
|
|
319
|
+
verify: probeSchema,
|
|
320
|
+
discover: probeSchema.optional(),
|
|
321
|
+
revoke: text,
|
|
322
|
+
http: httpSchema.optional(),
|
|
323
|
+
})
|
|
324
|
+
.strict()
|
|
325
|
+
.refine((c) => {
|
|
326
|
+
if (!c.http)
|
|
327
|
+
return true;
|
|
328
|
+
const field = (id, secret) => c.fields.some((f) => f.id === id && f.secret === secret && !f.options);
|
|
329
|
+
const a = c.http.auth;
|
|
330
|
+
const secretsOk = a.type === "header"
|
|
331
|
+
? field(a.value, true)
|
|
332
|
+
: a.type === "bearer"
|
|
333
|
+
? field(a.token, true)
|
|
334
|
+
: a.type === "basic"
|
|
335
|
+
? field(a.username, false) && field(a.password, true)
|
|
336
|
+
: field(a.clientId, false) && field(a.clientSecret, true);
|
|
337
|
+
const lists = new Set(c.limits.filter((l) => l.kind === "list").map((l) => l.id));
|
|
338
|
+
return (secretsOk &&
|
|
339
|
+
!c.provider &&
|
|
340
|
+
(c.accountKey === "host" || c.fields.some((f) => f.id === c.accountKey && !f.secret)) &&
|
|
341
|
+
c.http.tools.every((t) => Object.values(t.params).every((p) => !p.limit || lists.has(p.limit)) &&
|
|
342
|
+
t.answerLimits.every((a) => lists.has(a.limit))));
|
|
343
|
+
}, {
|
|
344
|
+
message: "An http app's auth names its fields (secrets as secret fields), its accountKey is host or a plain field, a param's or answer's limit names a list limit, and it has no provider",
|
|
345
|
+
})
|
|
346
|
+
.refine((c) => !c.agentAccess || c.limits.some((l) => l.id === c.agentAccess.limit && l.kind === "text"), { message: "agentAccess.limit must be one of the connector's text limits" })
|
|
347
|
+
.refine((c) => [...Object.keys(c.agentAccess?.probes ?? {}), ...(c.siteAccess?.write ?? [])].every((id) => c.capabilities.some((x) => x.id === id)) &&
|
|
348
|
+
(!Object.keys(c.agentAccess?.probes ?? {}).length || c.agentAccess?.missing !== undefined), { message: "agentAccess probes and siteAccess.write name capabilities; probes need missing" })
|
|
349
|
+
.refine((c) => new Set(c.fields.map((f) => f.id)).size === c.fields.length, {
|
|
350
|
+
message: "Field ids must be unique",
|
|
351
|
+
})
|
|
352
|
+
.refine((c) => new Set(c.capabilities.map((l) => l.id)).size === c.capabilities.length, {
|
|
353
|
+
message: "Capability ids must be unique",
|
|
354
|
+
})
|
|
355
|
+
.refine((c) => {
|
|
356
|
+
const tools = c.capabilities.flatMap((l) => l.tools);
|
|
357
|
+
return new Set(tools).size === tools.length;
|
|
358
|
+
}, { message: "A tool belongs to one capability only" })
|
|
359
|
+
.refine((c) => c.provider !== undefined || ![...c.setup, ...c.afterConnect].some((s) => s.settings), { message: "Step settings are kept on a provider connection: only a provider's app has them" })
|
|
360
|
+
.refine((c) => {
|
|
361
|
+
const isOption = (o, fields) => fields.some((f) => f.id === o.field && f.options?.some((x) => x.value === o.value));
|
|
362
|
+
return ([...c.setup, ...c.afterConnect].every((s) => !s.option || isOption(s.option, c.fields)) &&
|
|
363
|
+
c.fields.every((f, i) => !f.requires || (f.options && isOption(f.requires, c.fields.slice(0, i)))));
|
|
364
|
+
}, { message: "A step's option and a field's requires name an option of an earlier choice" })
|
|
365
|
+
.refine((c) => c.provider !== undefined || c.fields.length > 0, {
|
|
366
|
+
message: "A guided connector needs connect form fields",
|
|
367
|
+
})
|
|
368
|
+
.refine((c) => c.limits.every((l, i) => !l.keys || c.limits.slice(0, i).some((k) => k.id === l.keys && k.kind === "list")), { message: "A map limit's keys must be a list limit listed before it" });
|
|
369
|
+
// One sign-in shared by several apps, e.g. a customer's Microsoft Entra app used by mail and
|
|
370
|
+
// files. Its setup steps are shown with the first of its apps the admin connects.
|
|
371
|
+
export const providerSchema = z
|
|
372
|
+
.object({
|
|
373
|
+
id: z.string().regex(/^[a-z0-9-]+$/),
|
|
374
|
+
name: text,
|
|
375
|
+
logo: z.string().regex(/^\/brand\/[a-z0-9/-]+\.svg$/),
|
|
376
|
+
identity: text,
|
|
377
|
+
// `identity` while the connection uses the deployment's shared app instead of the customer's own.
|
|
378
|
+
sharedIdentity: text.optional(),
|
|
379
|
+
accountKey: z.string().regex(/^[A-Za-z]+$/),
|
|
380
|
+
// Config values naming who signs in (e.g. the app and its service principal). A change in
|
|
381
|
+
// any, like a change of account, disconnects the provider's apps: what the admin granted
|
|
382
|
+
// outside the service (mailbox roles, site grants) belongs to the old one.
|
|
383
|
+
principalKeys: z.array(z.string().regex(/^[A-Za-z]+$/)).default([]),
|
|
384
|
+
// The service can make a key pair whose certificate the admin uploads to their app.
|
|
385
|
+
certificate: z.boolean(),
|
|
386
|
+
setup: z.array(step),
|
|
387
|
+
fields: z.array(fieldSchema.extend({ optional: z.boolean().default(false) }).strict()).min(1),
|
|
388
|
+
// What one more agent needs outside the service (e.g. its mailbox), shown when its API key is
|
|
389
|
+
// made with one of the apps each step names.
|
|
390
|
+
addAgent: z.array(agentStep).default([]),
|
|
391
|
+
revoke: text,
|
|
392
|
+
})
|
|
393
|
+
.strict();
|
|
394
|
+
/** The repo's connectors/ folder, beside packages/ (and so beside dist/packages/ once built). */
|
|
395
|
+
export const CONNECTORS_DIR = new URL("../../../connectors/", import.meta.url);
|
|
396
|
+
// Each subfolder of dir holding `file` is one definition, whose id is the folder's name.
|
|
397
|
+
// Subfolders may be links: Kubernetes mounts ConfigMap and Secret folders that way.
|
|
398
|
+
function loadDir(dir, file, schema) {
|
|
399
|
+
return readdirSync(dir)
|
|
400
|
+
.filter((name) => existsSync(new URL(`${name}/${file}`, dir)))
|
|
401
|
+
.sort()
|
|
402
|
+
.map((name) => {
|
|
403
|
+
const where = `${name}/${file}`;
|
|
404
|
+
const raw = JSON.parse(readFileSync(new URL(where, dir), "utf8"));
|
|
405
|
+
let filled;
|
|
406
|
+
try {
|
|
407
|
+
filled = fillBrandDeep(raw);
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
throw new Error(`${where}: ${error.message}`);
|
|
411
|
+
}
|
|
412
|
+
const parsed = schema.safeParse(filled);
|
|
413
|
+
if (!parsed.success)
|
|
414
|
+
throw new Error(`${where}: ${z.prettifyError(parsed.error)}`);
|
|
415
|
+
if (parsed.data.id !== name)
|
|
416
|
+
throw new Error(`${where}: id must match the folder name`);
|
|
417
|
+
return parsed.data;
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
export function loadConnectors(dir = CONNECTORS_DIR) {
|
|
421
|
+
return loadDir(dir, "connector.json", connectorSchema);
|
|
422
|
+
}
|
|
423
|
+
export function loadProviders(dir = CONNECTORS_DIR) {
|
|
424
|
+
return loadDir(dir, "provider.json", providerSchema);
|
|
425
|
+
}
|
|
426
|
+
/** The ids of an app's choice fields: what its connection keeps from the admin's form. */
|
|
427
|
+
export const choiceFields = (connector) => connector.fields.filter((f) => f.options).map((f) => f.id);
|
|
428
|
+
/** The option chosen for each choice field: the stored one, else the first, which also holds
|
|
429
|
+
* while the earlier choice it `requires` is not made. */
|
|
430
|
+
export function chosenOptions(connector, config = {}) {
|
|
431
|
+
const chosen = {};
|
|
432
|
+
return connector.fields.flatMap((f) => {
|
|
433
|
+
if (!f.options)
|
|
434
|
+
return [];
|
|
435
|
+
const asked = !f.requires || chosen[f.requires.field] === f.requires.value;
|
|
436
|
+
const option = (asked && f.options.find((o) => o.value === config[f.id])) || f.options[0];
|
|
437
|
+
chosen[f.id] = option.value;
|
|
438
|
+
return [option];
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
/** The permissions a provider's token needs for these capabilities and the chosen options. */
|
|
442
|
+
export function tokenRolesFor(connector, capabilities, config = {}) {
|
|
443
|
+
return [
|
|
444
|
+
...new Set([
|
|
445
|
+
...(connector.scopes ?? []),
|
|
446
|
+
...connector.capabilities
|
|
447
|
+
.filter((c) => capabilities.includes(c.id))
|
|
448
|
+
.flatMap((c) => c.roles ?? c.scopes),
|
|
449
|
+
...chosenOptions(connector, config).flatMap((o) => o.scopes ?? []),
|
|
450
|
+
]),
|
|
451
|
+
];
|
|
452
|
+
}
|
|
453
|
+
// What an agent may actually do: its capabilities that the connection also allows.
|
|
454
|
+
export function effectiveCapabilities(connector, grant, ceiling) {
|
|
455
|
+
return connector.capabilities.filter((c) => grant.includes(c.id) && ceiling.includes(c.id));
|
|
456
|
+
}
|
|
457
|
+
// Keys of a provider connection's own config, which a setting saved beside them must not replace.
|
|
458
|
+
const RESERVED_SETTINGS = new Set(["tenantId", "clientId", "auth", "certificate", "sites"]);
|
|
459
|
+
/** The settings a provider's apps ask for in their steps, by id. */
|
|
460
|
+
export function providerSettings(connectors, provider) {
|
|
461
|
+
const out = new Map();
|
|
462
|
+
for (const c of connectors)
|
|
463
|
+
if (c.provider === provider)
|
|
464
|
+
for (const s of [...c.setup, ...c.afterConnect])
|
|
465
|
+
for (const setting of s.settings ?? []) {
|
|
466
|
+
if (RESERVED_SETTINGS.has(setting.id))
|
|
467
|
+
throw new Error(`${c.id}: setting id ${setting.id} is the connection's own`);
|
|
468
|
+
out.set(setting.id, setting);
|
|
469
|
+
}
|
|
470
|
+
return out;
|
|
471
|
+
}
|
|
472
|
+
export function expandCopy(lines, scopes) {
|
|
473
|
+
return lines
|
|
474
|
+
.flatMap((line) => line.includes("{scope}") ? scopes.map((s) => line.replaceAll("{scope}", s)) : [line])
|
|
475
|
+
.map((line) => line.replaceAll("{scopes}", scopes.join(" ")))
|
|
476
|
+
.join("\n");
|
|
477
|
+
}
|
|
478
|
+
// Reads `a.b` / `values[].name` paths out of a JSON response for display.
|
|
479
|
+
export function pickDisplay(data, path, match = {}) {
|
|
480
|
+
const matches = (v) => Object.entries(match).every(([k, want]) => v && typeof v === "object" && v[k] === want);
|
|
481
|
+
let values = [data];
|
|
482
|
+
for (const part of path.split(".")) {
|
|
483
|
+
const many = part.endsWith("[]");
|
|
484
|
+
const key = many ? part.slice(0, -2) : part;
|
|
485
|
+
values = values.flatMap((v) => {
|
|
486
|
+
const next = v && typeof v === "object" ? v[key] : undefined;
|
|
487
|
+
return many ? (Array.isArray(next) ? next.filter(matches) : []) : [next];
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
return values.filter((v) => v !== undefined && v !== null).map(String);
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=connector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../../../packages/connector-kit/src/connector.ts"],"names":[],"mappings":"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"}
|