@arbium/enterprise-agent-connect 0.1.1 → 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/README.md +157 -10
- package/dist/connectors/dell-techdirect/index.d.ts +8 -0
- package/dist/connectors/dell-techdirect/tools.d.ts +2 -0
- package/dist/connectors/dell-techdirect/vendor.d.ts +6 -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/index.d.ts +2 -0
- package/dist/connectors/entra/tools.d.ts +14 -0
- package/dist/connectors/fedex/index.d.ts +8 -0
- package/dist/connectors/fedex/tools.d.ts +3 -0
- package/dist/connectors/fedex/vendor.d.ts +7 -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 +151 -64
- package/dist/connectors/http/index.js.map +1 -1
- package/dist/connectors/intune/index.d.ts +2 -0
- package/dist/connectors/intune/tools.d.ts +12 -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 +144 -1
- package/dist/connectors/jira/index.d.ts +8 -0
- package/dist/connectors/jira/jql.d.ts +4 -0
- package/dist/connectors/jira/tools.d.ts +3 -0
- package/dist/connectors/jira/vendor.d.ts +3 -0
- package/dist/connectors/microsoft/client.d.ts +58 -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/index.d.ts +2 -0
- package/dist/connectors/outlook-calendar/tools.d.ts +65 -0
- package/dist/connectors/outlook-mail/index.d.ts +2 -0
- package/dist/connectors/outlook-mail/tools.d.ts +8 -0
- package/dist/connectors/salesforce/index.d.ts +8 -0
- package/dist/connectors/salesforce/soql.d.ts +3 -0
- package/dist/connectors/salesforce/tools.d.ts +9 -0
- package/dist/connectors/salesforce/vendor.d.ts +3 -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/excel.d.ts +16 -0
- package/dist/connectors/sharepoint-files/index.d.ts +11 -0
- package/dist/connectors/sharepoint-files/tools.d.ts +52 -0
- package/dist/connectors/sharepoint-files/vendor.d.ts +11 -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/index.d.ts +2 -0
- package/dist/connectors/teams/tools.d.ts +2 -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/certificate.d.ts +19 -0
- package/dist/packages/connector-kit/src/common.d.ts +40 -0
- package/dist/packages/connector-kit/src/connector.d.ts +1346 -0
- package/dist/packages/connector-kit/src/connector.js +586 -44
- package/dist/packages/connector-kit/src/connector.js.map +1 -1
- 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 +21 -4
- package/dist/packages/connector-kit/src/oauth.js.map +1 -1
- package/dist/packages/connector-kit/src/types.d.ts +85 -0
- package/dist/packages/connector-kit/src/types.js.map +1 -1
- package/dist/packages/server/migrations/0007_app_events.sql +110 -0
- package/dist/packages/server/migrations/rollback/to-legacy.sql +3 -0
- package/dist/packages/server/src/api.d.ts +3714 -0
- package/dist/packages/server/src/api.js +135 -1
- package/dist/packages/server/src/api.js.map +1 -1
- package/dist/packages/server/src/app.d.ts +23 -0
- package/dist/packages/server/src/app.js +24 -1
- package/dist/packages/server/src/app.js.map +1 -1
- package/dist/packages/server/src/builtin.d.ts +4 -0
- package/dist/packages/server/src/builtin.js +18 -0
- package/dist/packages/server/src/builtin.js.map +1 -1
- package/dist/packages/server/src/consent.d.ts +27 -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 +67 -11
- package/dist/packages/server/src/index.js.map +1 -1
- package/dist/packages/server/src/migrate.d.ts +11 -0
- package/dist/packages/server/src/openapi.d.ts +4 -0
- package/dist/packages/server/src/openapi.js +2 -2
- package/dist/packages/server/src/openapi.js.map +1 -1
- 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/server.d.ts +1 -0
- package/dist/packages/server/src/server.js +14 -1
- package/dist/packages/server/src/server.js.map +1 -1
- package/dist/packages/server/src/service.d.ts +760 -0
- package/dist/packages/server/src/service.js +10 -0
- package/dist/packages/server/src/service.js.map +1 -1
- package/dist/packages/server/src/store.d.ts +158 -0
- package/dist/packages/server/src/store.js +4 -0
- package/dist/packages/server/src/store.js.map +1 -1
- package/dist/packages/server/src/teams/activity.d.ts +123 -0
- package/dist/packages/server/src/teams/activity.js +6 -5
- package/dist/packages/server/src/teams/activity.js.map +1 -1
- package/dist/packages/server/src/teams/admin.d.ts +335 -0
- package/dist/packages/server/src/teams/admin.js +1 -1
- package/dist/packages/server/src/teams/admin.js.map +1 -1
- package/dist/packages/server/src/teams/approval.d.ts +57 -0
- package/dist/packages/server/src/teams/bot.d.ts +25 -0
- package/dist/packages/server/src/teams/claude.d.ts +46 -0
- package/dist/packages/server/src/teams/jwt.d.ts +17 -0
- package/dist/packages/server/src/teams/package.d.ts +79 -0
- package/dist/packages/server/src/teams/provision.d.ts +84 -0
- package/dist/packages/server/src/teams/runner.d.ts +80 -0
- package/dist/packages/server/src/teams/runner.js +50 -6
- package/dist/packages/server/src/teams/runner.js.map +1 -1
- package/dist/packages/server/src/teams/runtime.d.ts +91 -0
- package/dist/packages/server/src/teams/runtime.js +25 -47
- package/dist/packages/server/src/teams/runtime.js.map +1 -1
- package/dist/packages/server/src/teams/store.d.ts +233 -0
- package/package.json +28 -2
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { channelQuery, slackError } from "./vendor.js";
|
|
3
|
+
import { audited, Denied, json, listLimit, VendorFailed, } from "../../packages/connector-kit/src/common.js";
|
|
4
|
+
// Slack as the app's bot: it reaches only channels it is a member of (Slack refuses the rest
|
|
5
|
+
// with not_in_channel), within the key's `channels` limit. Direct messages are out of reach:
|
|
6
|
+
// the manifest asks for no im or mpim scope.
|
|
7
|
+
const CHANNEL = /^[CG][A-Z0-9]{2,20}$/;
|
|
8
|
+
const TS = /^\d{9,11}\.\d{6}$/;
|
|
9
|
+
const MAX_TEXT = 40_000;
|
|
10
|
+
const MAX_FILE_BYTES = 1_000_000;
|
|
11
|
+
// users.info calls one answer makes at most to put names on people; the rest keep only ids.
|
|
12
|
+
const MAX_NAME_LOOKUPS = 20;
|
|
13
|
+
async function ok(ctx, mark, req) {
|
|
14
|
+
const res = await ctx.call(req);
|
|
15
|
+
mark(res.status);
|
|
16
|
+
if (res.status < 200 || res.status >= 300)
|
|
17
|
+
throw new VendorFailed(res.status, slackError(res));
|
|
18
|
+
return res.data;
|
|
19
|
+
}
|
|
20
|
+
const query = (params) => new URLSearchParams(Object.entries(params).flatMap(([k, v]) => v === undefined || v === "" ? [] : [[k, String(v)]])).toString();
|
|
21
|
+
function channel(ctx, id) {
|
|
22
|
+
if (!CHANNEL.test(id))
|
|
23
|
+
throw new Denied("Give a channel id such as C0123ABCD from slack_list_channels");
|
|
24
|
+
const allowed = listLimit(ctx.limits, "channels");
|
|
25
|
+
if (allowed && !allowed.includes(id))
|
|
26
|
+
throw new Denied("This agent may not use that channel");
|
|
27
|
+
return id;
|
|
28
|
+
}
|
|
29
|
+
function timestamp(ts, what = "message") {
|
|
30
|
+
if (!TS.test(ts))
|
|
31
|
+
throw new Denied(`Give the ${what}'s ts, such as 1730000000.123456`);
|
|
32
|
+
return ts;
|
|
33
|
+
}
|
|
34
|
+
// A Slack ts or an ISO 8601 time, as the ts Slack's history bounds take.
|
|
35
|
+
function bound(value) {
|
|
36
|
+
if (value === undefined)
|
|
37
|
+
return undefined;
|
|
38
|
+
if (TS.test(value) || /^\d{9,11}$/.test(value))
|
|
39
|
+
return value;
|
|
40
|
+
const ms = Date.parse(value);
|
|
41
|
+
if (Number.isNaN(ms))
|
|
42
|
+
throw new Denied(`${value} is neither a Slack ts nor an ISO 8601 time`);
|
|
43
|
+
return (ms / 1000).toFixed(6);
|
|
44
|
+
}
|
|
45
|
+
// Slack's mrkdwn markup to plain text: mentions and channel links by name, links as
|
|
46
|
+
// "label (url)", and its three escaped characters back.
|
|
47
|
+
export function plainText(text, names) {
|
|
48
|
+
return text
|
|
49
|
+
.replace(/<([^<>]+)>/g, (_, inner) => {
|
|
50
|
+
const bar = inner.indexOf("|");
|
|
51
|
+
const target = bar < 0 ? inner : inner.slice(0, bar);
|
|
52
|
+
const label = bar < 0 ? null : inner.slice(bar + 1);
|
|
53
|
+
if (target.startsWith("@"))
|
|
54
|
+
return `@${names.get(target.slice(1)) ?? label ?? target.slice(1)}`;
|
|
55
|
+
if (target.startsWith("#"))
|
|
56
|
+
return `#${label ?? target.slice(1)}`;
|
|
57
|
+
if (target.startsWith("!subteam^"))
|
|
58
|
+
return label ?? "@group";
|
|
59
|
+
if (target.startsWith("!date^"))
|
|
60
|
+
return label ?? target;
|
|
61
|
+
if (target.startsWith("!"))
|
|
62
|
+
return `@${target.slice(1)}`;
|
|
63
|
+
return label && label !== target ? `${label} (${target})` : target;
|
|
64
|
+
})
|
|
65
|
+
.replaceAll("<", "<")
|
|
66
|
+
.replaceAll(">", ">")
|
|
67
|
+
.replaceAll("&", "&");
|
|
68
|
+
}
|
|
69
|
+
// People's names for the authors and mentions of these messages. A failed lookup leaves the
|
|
70
|
+
// id alone: a name is a convenience, never worth failing the read.
|
|
71
|
+
async function names(ctx, messages) {
|
|
72
|
+
const ids = new Set();
|
|
73
|
+
for (const m of messages) {
|
|
74
|
+
if (m.user)
|
|
75
|
+
ids.add(m.user);
|
|
76
|
+
for (const [, id] of (m.text ?? "").matchAll(/<@([UW][A-Z0-9]+)/g))
|
|
77
|
+
ids.add(id);
|
|
78
|
+
}
|
|
79
|
+
const found = new Map();
|
|
80
|
+
for (const id of [...ids].slice(0, MAX_NAME_LOOKUPS)) {
|
|
81
|
+
const res = await ctx.call({ method: "GET", path: `/users.info?${query({ user: id })}` });
|
|
82
|
+
const u = res.data?.user;
|
|
83
|
+
if (res.status === 200 && u)
|
|
84
|
+
found.set(id, u.profile?.display_name || u.real_name || u.name || id);
|
|
85
|
+
}
|
|
86
|
+
return found;
|
|
87
|
+
}
|
|
88
|
+
function message(m, who) {
|
|
89
|
+
const text = m.text || (m.attachments ?? []).map((a) => a.fallback ?? a.text ?? "").join("\n");
|
|
90
|
+
return {
|
|
91
|
+
ts: m.ts,
|
|
92
|
+
at: new Date(Number(m.ts) * 1000).toISOString(),
|
|
93
|
+
...(m.user ? { user_id: m.user, user: who.get(m.user) ?? null } : {}),
|
|
94
|
+
...(m.bot_id ? { bot: m.bot_profile?.name ?? m.username ?? m.bot_id } : {}),
|
|
95
|
+
...(m.subtype ? { subtype: m.subtype } : {}),
|
|
96
|
+
text: plainText(text, who),
|
|
97
|
+
...(m.thread_ts ? { thread_ts: m.thread_ts } : {}),
|
|
98
|
+
...(m.reply_count ? { reply_count: m.reply_count } : {}),
|
|
99
|
+
...(m.edited ? { edited: true } : {}),
|
|
100
|
+
...(m.reactions?.length
|
|
101
|
+
? { reactions: m.reactions.map((r) => ({ emoji: r.name, count: r.count })) }
|
|
102
|
+
: {}),
|
|
103
|
+
...(m.files?.length ? { files: m.files.map((f) => f.title || f.name || "file") } : {}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async function messages(ctx, list) {
|
|
107
|
+
const who = await names(ctx, list);
|
|
108
|
+
return list.map((m) => message(m, who));
|
|
109
|
+
}
|
|
110
|
+
const channelId = z.string().describe("Channel id, e.g. C0123ABCD, from slack_list_channels.");
|
|
111
|
+
const ts = z.string().describe("The message's ts, e.g. 1730000000.123456.");
|
|
112
|
+
const cursor = z.string().max(500).optional().describe("The next value of the previous answer.");
|
|
113
|
+
export const slackTools = {
|
|
114
|
+
names: [
|
|
115
|
+
"slack_list_channels",
|
|
116
|
+
"slack_read_channel",
|
|
117
|
+
"slack_read_thread",
|
|
118
|
+
"slack_get_permalink",
|
|
119
|
+
"slack_post_message",
|
|
120
|
+
"slack_add_reaction",
|
|
121
|
+
"slack_upload_text_file",
|
|
122
|
+
"slack_find_user_by_email",
|
|
123
|
+
"slack_delete_message",
|
|
124
|
+
],
|
|
125
|
+
register(server, ctx, allowed) {
|
|
126
|
+
const readOnly = { readOnlyHint: true, openWorldHint: true };
|
|
127
|
+
const writes = { readOnlyHint: false, destructiveHint: false, openWorldHint: true };
|
|
128
|
+
if (allowed.has("slack_list_channels"))
|
|
129
|
+
server.registerTool("slack_list_channels", {
|
|
130
|
+
description: "List the Slack channels this agent can use: those the app was added to, within the agent's limits.",
|
|
131
|
+
inputSchema: z.object({ cursor }),
|
|
132
|
+
annotations: readOnly,
|
|
133
|
+
}, ({ cursor }) => audited(ctx, "slack_list_channels", null, async (mark) => {
|
|
134
|
+
const limit = listLimit(ctx.limits, "channels");
|
|
135
|
+
const data = await ok(ctx, mark, {
|
|
136
|
+
method: "GET",
|
|
137
|
+
path: `/users.conversations?${channelQuery(200, cursor)}`,
|
|
138
|
+
});
|
|
139
|
+
const channels = (data.channels ?? [])
|
|
140
|
+
.filter((c) => !limit || limit.includes(c.id))
|
|
141
|
+
.map((c) => ({
|
|
142
|
+
id: c.id,
|
|
143
|
+
name: c.name ?? null,
|
|
144
|
+
private: Boolean(c.is_private),
|
|
145
|
+
topic: c.topic?.value || null,
|
|
146
|
+
purpose: c.purpose?.value || null,
|
|
147
|
+
}));
|
|
148
|
+
return json({ channels, next: data.response_metadata?.next_cursor || null });
|
|
149
|
+
}));
|
|
150
|
+
if (allowed.has("slack_read_channel"))
|
|
151
|
+
server.registerTool("slack_read_channel", {
|
|
152
|
+
description: "Read a Slack channel's messages, newest first. A message with reply_count has a thread: read it with slack_read_thread. oldest and latest bound the window (a ts or an ISO 8601 time).",
|
|
153
|
+
inputSchema: z.object({
|
|
154
|
+
channel: channelId,
|
|
155
|
+
limit: z.number().int().min(1).max(100).default(20),
|
|
156
|
+
oldest: z.string().optional(),
|
|
157
|
+
latest: z.string().optional(),
|
|
158
|
+
cursor,
|
|
159
|
+
}),
|
|
160
|
+
annotations: readOnly,
|
|
161
|
+
}, (args) => audited(ctx, "slack_read_channel", args.channel, async (mark) => {
|
|
162
|
+
const data = await ok(ctx, mark, {
|
|
163
|
+
method: "GET",
|
|
164
|
+
path: `/conversations.history?${query({
|
|
165
|
+
channel: channel(ctx, args.channel),
|
|
166
|
+
limit: args.limit,
|
|
167
|
+
oldest: bound(args.oldest),
|
|
168
|
+
latest: bound(args.latest),
|
|
169
|
+
cursor: args.cursor,
|
|
170
|
+
})}`,
|
|
171
|
+
});
|
|
172
|
+
return json({
|
|
173
|
+
messages: await messages(ctx, data.messages ?? []),
|
|
174
|
+
next: data.response_metadata?.next_cursor || null,
|
|
175
|
+
});
|
|
176
|
+
}));
|
|
177
|
+
if (allowed.has("slack_read_thread"))
|
|
178
|
+
server.registerTool("slack_read_thread", {
|
|
179
|
+
description: "Read a Slack thread, oldest first: the message that started it, then its replies.",
|
|
180
|
+
inputSchema: z.object({
|
|
181
|
+
channel: channelId,
|
|
182
|
+
thread_ts: z.string().describe("The ts of the message that started the thread."),
|
|
183
|
+
limit: z.number().int().min(1).max(200).default(50),
|
|
184
|
+
cursor,
|
|
185
|
+
}),
|
|
186
|
+
annotations: readOnly,
|
|
187
|
+
}, (args) => audited(ctx, "slack_read_thread", `${args.channel} ${args.thread_ts}`, async (mark) => {
|
|
188
|
+
const data = await ok(ctx, mark, {
|
|
189
|
+
method: "GET",
|
|
190
|
+
path: `/conversations.replies?${query({
|
|
191
|
+
channel: channel(ctx, args.channel),
|
|
192
|
+
ts: timestamp(args.thread_ts, "thread"),
|
|
193
|
+
limit: args.limit,
|
|
194
|
+
cursor: args.cursor,
|
|
195
|
+
})}`,
|
|
196
|
+
});
|
|
197
|
+
return json({
|
|
198
|
+
messages: await messages(ctx, data.messages ?? []),
|
|
199
|
+
next: data.response_metadata?.next_cursor || null,
|
|
200
|
+
});
|
|
201
|
+
}));
|
|
202
|
+
if (allowed.has("slack_get_permalink"))
|
|
203
|
+
server.registerTool("slack_get_permalink", {
|
|
204
|
+
description: "Get a link people can open to one Slack message.",
|
|
205
|
+
inputSchema: z.object({ channel: channelId, ts }),
|
|
206
|
+
annotations: readOnly,
|
|
207
|
+
}, (args) => audited(ctx, "slack_get_permalink", `${args.channel} ${args.ts}`, async (mark) => {
|
|
208
|
+
const data = await ok(ctx, mark, {
|
|
209
|
+
method: "GET",
|
|
210
|
+
path: `/chat.getPermalink?${query({
|
|
211
|
+
channel: channel(ctx, args.channel),
|
|
212
|
+
message_ts: timestamp(args.ts),
|
|
213
|
+
})}`,
|
|
214
|
+
});
|
|
215
|
+
return json({ permalink: data.permalink });
|
|
216
|
+
}));
|
|
217
|
+
if (allowed.has("slack_post_message"))
|
|
218
|
+
server.registerTool("slack_post_message", {
|
|
219
|
+
description: "Post a message as the app in a Slack channel, or reply in a thread with thread_ts. Slack mrkdwn works: *bold*, _italic_, `code`, <@U0123ABCD> mentions a person.",
|
|
220
|
+
inputSchema: z.object({
|
|
221
|
+
channel: channelId,
|
|
222
|
+
text: z.string().min(1).max(MAX_TEXT),
|
|
223
|
+
thread_ts: z.string().optional().describe("Reply in this message's thread."),
|
|
224
|
+
also_send_to_channel: z
|
|
225
|
+
.boolean()
|
|
226
|
+
.default(false)
|
|
227
|
+
.describe("With thread_ts: also show the reply in the channel."),
|
|
228
|
+
}),
|
|
229
|
+
annotations: writes,
|
|
230
|
+
}, (args) => audited(ctx, "slack_post_message", args.channel, async (mark) => {
|
|
231
|
+
const data = await ok(ctx, mark, {
|
|
232
|
+
method: "POST",
|
|
233
|
+
path: "/chat.postMessage",
|
|
234
|
+
body: {
|
|
235
|
+
channel: channel(ctx, args.channel),
|
|
236
|
+
text: args.text,
|
|
237
|
+
...(args.thread_ts
|
|
238
|
+
? {
|
|
239
|
+
thread_ts: timestamp(args.thread_ts, "thread"),
|
|
240
|
+
reply_broadcast: args.also_send_to_channel,
|
|
241
|
+
}
|
|
242
|
+
: {}),
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
return json({ channel: data.channel, ts: data.ts, thread_ts: args.thread_ts ?? null });
|
|
246
|
+
}));
|
|
247
|
+
if (allowed.has("slack_add_reaction"))
|
|
248
|
+
server.registerTool("slack_add_reaction", {
|
|
249
|
+
description: "Add an emoji reaction as the app to a Slack message, e.g. eyes or white_check_mark.",
|
|
250
|
+
inputSchema: z.object({
|
|
251
|
+
channel: channelId,
|
|
252
|
+
ts,
|
|
253
|
+
emoji: z.string().min(1).max(100).describe("Emoji name, with or without colons."),
|
|
254
|
+
}),
|
|
255
|
+
annotations: writes,
|
|
256
|
+
}, (args) => audited(ctx, "slack_add_reaction", `${args.channel} ${args.ts}`, async (mark) => {
|
|
257
|
+
const name = args.emoji.replace(/^:|:$/g, "");
|
|
258
|
+
const res = await ctx.call({
|
|
259
|
+
method: "POST",
|
|
260
|
+
path: "/reactions.add",
|
|
261
|
+
body: { channel: channel(ctx, args.channel), timestamp: timestamp(args.ts), name },
|
|
262
|
+
});
|
|
263
|
+
mark(res.status);
|
|
264
|
+
// Already there is what the agent asked for.
|
|
265
|
+
if (res.data?.error === "already_reacted")
|
|
266
|
+
return json({ reacted: true, already: true });
|
|
267
|
+
if (res.status !== 200)
|
|
268
|
+
throw new VendorFailed(res.status, slackError(res));
|
|
269
|
+
return json({ reacted: true, already: false });
|
|
270
|
+
}));
|
|
271
|
+
if (allowed.has("slack_upload_text_file"))
|
|
272
|
+
server.registerTool("slack_upload_text_file", {
|
|
273
|
+
description: "Share a text file (up to 1 MB), such as a report or a CSV, as the app in a Slack channel or thread.",
|
|
274
|
+
inputSchema: z.object({
|
|
275
|
+
channel: channelId,
|
|
276
|
+
filename: z.string().min(1).max(255).describe("e.g. report.csv"),
|
|
277
|
+
content: z.string().min(1),
|
|
278
|
+
title: z.string().max(255).optional(),
|
|
279
|
+
comment: z
|
|
280
|
+
.string()
|
|
281
|
+
.max(MAX_TEXT)
|
|
282
|
+
.optional()
|
|
283
|
+
.describe("A message posted with the file."),
|
|
284
|
+
thread_ts: z.string().optional().describe("Share it in this message's thread."),
|
|
285
|
+
}),
|
|
286
|
+
annotations: writes,
|
|
287
|
+
}, (args) => audited(ctx, "slack_upload_text_file", `${args.channel} ${args.filename}`, async (mark) => {
|
|
288
|
+
const id = channel(ctx, args.channel);
|
|
289
|
+
if (/[/\\\x00-\x1f]/.test(args.filename))
|
|
290
|
+
throw new Denied("Give a file name without slashes or control characters");
|
|
291
|
+
const thread = args.thread_ts ? timestamp(args.thread_ts, "thread") : undefined;
|
|
292
|
+
const length = Buffer.byteLength(args.content, "utf8");
|
|
293
|
+
if (length > MAX_FILE_BYTES)
|
|
294
|
+
throw new Denied("The file is over 1 MB");
|
|
295
|
+
// Slack's upload: an address for the bytes, the bytes, then sharing it.
|
|
296
|
+
const slot = await ok(ctx, mark, {
|
|
297
|
+
method: "POST",
|
|
298
|
+
path: `/files.getUploadURLExternal?${query({ filename: args.filename, length })}`,
|
|
299
|
+
});
|
|
300
|
+
await ok(ctx, mark, { method: "POST", path: slot.upload_url, body: args.content });
|
|
301
|
+
await ok(ctx, mark, {
|
|
302
|
+
method: "POST",
|
|
303
|
+
path: "/files.completeUploadExternal",
|
|
304
|
+
body: {
|
|
305
|
+
files: [{ id: slot.file_id, title: args.title ?? args.filename }],
|
|
306
|
+
channel_id: id,
|
|
307
|
+
...(args.comment ? { initial_comment: args.comment } : {}),
|
|
308
|
+
...(thread ? { thread_ts: thread } : {}),
|
|
309
|
+
},
|
|
310
|
+
});
|
|
311
|
+
return json({ file_id: slot.file_id, channel: id, thread_ts: thread ?? null });
|
|
312
|
+
}));
|
|
313
|
+
if (allowed.has("slack_find_user_by_email"))
|
|
314
|
+
server.registerTool("slack_find_user_by_email", {
|
|
315
|
+
description: "Find a person in the Slack workspace by email address, e.g. to mention them as <@id> in a message.",
|
|
316
|
+
inputSchema: z.object({ email: z.email() }),
|
|
317
|
+
annotations: readOnly,
|
|
318
|
+
}, ({ email }) => audited(ctx, "slack_find_user_by_email", email, async (mark) => {
|
|
319
|
+
const res = await ctx.call({
|
|
320
|
+
method: "GET",
|
|
321
|
+
path: `/users.lookupByEmail?${query({ email })}`,
|
|
322
|
+
});
|
|
323
|
+
mark(res.status);
|
|
324
|
+
if (res.status === 404)
|
|
325
|
+
return json({ found: false });
|
|
326
|
+
if (res.status !== 200)
|
|
327
|
+
throw new VendorFailed(res.status, slackError(res));
|
|
328
|
+
const u = res.data.user;
|
|
329
|
+
return json({
|
|
330
|
+
found: true,
|
|
331
|
+
id: u.id,
|
|
332
|
+
name: u.profile?.display_name || u.real_name || u.name,
|
|
333
|
+
real_name: u.real_name ?? null,
|
|
334
|
+
title: u.profile?.title || null,
|
|
335
|
+
time_zone: u.tz ?? null,
|
|
336
|
+
is_bot: Boolean(u.is_bot),
|
|
337
|
+
deactivated: Boolean(u.deleted),
|
|
338
|
+
});
|
|
339
|
+
}));
|
|
340
|
+
if (allowed.has("slack_delete_message"))
|
|
341
|
+
server.registerTool("slack_delete_message", {
|
|
342
|
+
description: "Delete a message the app posted. Slack cannot bring it back, and the app cannot delete anyone else's message.",
|
|
343
|
+
inputSchema: z.object({ channel: channelId, ts }),
|
|
344
|
+
annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: true },
|
|
345
|
+
}, (args) => audited(ctx, "slack_delete_message", `${args.channel} ${args.ts}`, async (mark) => {
|
|
346
|
+
await ok(ctx, mark, {
|
|
347
|
+
method: "POST",
|
|
348
|
+
path: "/chat.delete",
|
|
349
|
+
body: { channel: channel(ctx, args.channel), ts: timestamp(args.ts) },
|
|
350
|
+
});
|
|
351
|
+
return json({ deleted: true, channel: args.channel, ts: args.ts });
|
|
352
|
+
}));
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../connectors/slack/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Fetch, type Vendor, type VendorConnection, type VendorResponse } from "../../packages/connector-kit/src/types.js";
|
|
2
|
+
export declare function slackError(res: VendorResponse): string;
|
|
3
|
+
export declare function slackVendor(fetchImpl?: Fetch, wait?: (seconds: number) => Promise<unknown>): Vendor;
|
|
4
|
+
export type Channel = {
|
|
5
|
+
id: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
is_private?: boolean;
|
|
8
|
+
is_archived?: boolean;
|
|
9
|
+
topic?: {
|
|
10
|
+
value?: string;
|
|
11
|
+
};
|
|
12
|
+
purpose?: {
|
|
13
|
+
value?: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export declare function memberChannels(call: Vendor["call"], connection: VendorConnection): Promise<Channel[]>;
|
|
17
|
+
export declare const channelQuery: (limit: number, cursor?: string) => string;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { ConnectError, } from "../../packages/connector-kit/src/types.js";
|
|
2
|
+
// A Slack app's bot token (xoxb-), made from the manifest in the setup steps and installed to
|
|
3
|
+
// one workspace. Web API methods at slack.com/api/<method>: reads as GET with query arguments,
|
|
4
|
+
// writes as POST JSON (docs.slack.dev/apis/web-api). Slack answers most
|
|
5
|
+
// failures 200 with {ok: false, error}; call() turns those into a status so the service's
|
|
6
|
+
// probes and the tools' VendorFailed treat them like any app's refusal.
|
|
7
|
+
const API = "https://slack.com/api";
|
|
8
|
+
// Where files.getUploadURLExternal points the file's bytes; the only other host called.
|
|
9
|
+
const UPLOAD_HOST = "files.slack.com";
|
|
10
|
+
// Waits longer than this are answered as 429 for the agent to retry later.
|
|
11
|
+
const MAX_WAIT_SECONDS = 10;
|
|
12
|
+
const RETRIES = 2;
|
|
13
|
+
const STATUS = {
|
|
14
|
+
not_authed: 401,
|
|
15
|
+
invalid_auth: 401,
|
|
16
|
+
account_inactive: 401,
|
|
17
|
+
token_revoked: 401,
|
|
18
|
+
token_expired: 401,
|
|
19
|
+
missing_scope: 403,
|
|
20
|
+
not_allowed_token_type: 403,
|
|
21
|
+
no_permission: 403,
|
|
22
|
+
restricted_action: 403,
|
|
23
|
+
ekm_access_denied: 403,
|
|
24
|
+
channel_not_found: 404,
|
|
25
|
+
message_not_found: 404,
|
|
26
|
+
thread_not_found: 404,
|
|
27
|
+
users_not_found: 404,
|
|
28
|
+
user_not_found: 404,
|
|
29
|
+
ratelimited: 429,
|
|
30
|
+
};
|
|
31
|
+
// Slack's error codes in words an agent or admin can act on; others are passed as they are.
|
|
32
|
+
const WORDS = {
|
|
33
|
+
not_in_channel: "the app is not a member of that channel. Someone in the channel can add it with /invite",
|
|
34
|
+
channel_not_found: "no channel with that id is visible to the app",
|
|
35
|
+
is_archived: "that channel is archived",
|
|
36
|
+
message_not_found: "no message with that timestamp in that channel",
|
|
37
|
+
thread_not_found: "no thread with that timestamp in that channel",
|
|
38
|
+
cant_delete_message: "the app can delete only its own messages",
|
|
39
|
+
msg_too_long: "the message is too long",
|
|
40
|
+
no_text: "the message is empty",
|
|
41
|
+
invalid_name: "no emoji with that name",
|
|
42
|
+
too_many_reactions: "that message has too many reactions",
|
|
43
|
+
users_not_found: "no person with that email address",
|
|
44
|
+
missing_scope: "the Slack app lacks a permission this needs",
|
|
45
|
+
invalid_auth: "Slack no longer accepts the app's token",
|
|
46
|
+
token_revoked: "the app's token was revoked",
|
|
47
|
+
account_inactive: "the app was uninstalled or its token deactivated",
|
|
48
|
+
};
|
|
49
|
+
export function slackError(res) {
|
|
50
|
+
const d = res.data;
|
|
51
|
+
if (res.status === 429) {
|
|
52
|
+
const after = typeof d?.retry_after === "number" ? ` Try again in ${d.retry_after} seconds.` : "";
|
|
53
|
+
return `Slack is limiting how often the app may call it.${after}`;
|
|
54
|
+
}
|
|
55
|
+
const code = typeof d?.error === "string" ? d.error : null;
|
|
56
|
+
if (!code)
|
|
57
|
+
return `Slack answered ${res.status}`;
|
|
58
|
+
const needed = code === "missing_scope" && typeof d?.needed === "string" ? ` (${d.needed})` : "";
|
|
59
|
+
return `Slack answered ${code}: ${WORDS[code] ?? code.replaceAll("_", " ")}${needed}`;
|
|
60
|
+
}
|
|
61
|
+
const sleep = (seconds) => new Promise((r) => setTimeout(r, seconds * 1000));
|
|
62
|
+
export function slackVendor(fetchImpl = fetch, wait = sleep) {
|
|
63
|
+
// A 429 means Slack did not run the call, so even a post is safe to send again.
|
|
64
|
+
async function send(token, request) {
|
|
65
|
+
const upload = request.path.startsWith("https://");
|
|
66
|
+
if (upload && new URL(request.path).host !== UPLOAD_HOST)
|
|
67
|
+
throw new Error("Slack upload address on an unexpected host");
|
|
68
|
+
for (let attempt = 0;; attempt++) {
|
|
69
|
+
const res = await fetchImpl(upload ? request.path : `${API}${request.path}`, {
|
|
70
|
+
method: request.method,
|
|
71
|
+
redirect: "error",
|
|
72
|
+
headers: upload
|
|
73
|
+
? { "content-type": "application/octet-stream" }
|
|
74
|
+
: {
|
|
75
|
+
authorization: `Bearer ${token}`,
|
|
76
|
+
...(request.body === undefined
|
|
77
|
+
? {}
|
|
78
|
+
: { "content-type": "application/json; charset=utf-8" }),
|
|
79
|
+
},
|
|
80
|
+
body: request.body === undefined
|
|
81
|
+
? undefined
|
|
82
|
+
: upload
|
|
83
|
+
? String(request.body)
|
|
84
|
+
: JSON.stringify(request.body),
|
|
85
|
+
});
|
|
86
|
+
const raw = await res.text();
|
|
87
|
+
if (res.status === 429) {
|
|
88
|
+
const after = Number(res.headers.get("retry-after") ?? "1");
|
|
89
|
+
if (attempt < RETRIES && Number.isFinite(after) && after <= MAX_WAIT_SECONDS) {
|
|
90
|
+
await wait(Math.max(after, 1));
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const data = { ok: false, error: "ratelimited", retry_after: after };
|
|
94
|
+
return { headers: res.headers, response: { status: 429, data } };
|
|
95
|
+
}
|
|
96
|
+
const data = raw ? parse(raw) : null;
|
|
97
|
+
const error = !upload && res.ok ? refusal(data) : null;
|
|
98
|
+
const status = error === null ? res.status : (STATUS[error] ?? 400);
|
|
99
|
+
return { headers: res.headers, response: { status, data } };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const token = (c) => {
|
|
103
|
+
const t = c.secret.bot_token;
|
|
104
|
+
if (!t)
|
|
105
|
+
throw new Error("Slack connection has no bot token");
|
|
106
|
+
return t;
|
|
107
|
+
};
|
|
108
|
+
const call = async (c, request) => (await send(token(c), request)).response;
|
|
109
|
+
return {
|
|
110
|
+
async connect(fields) {
|
|
111
|
+
const botToken = fields.bot_token?.trim() ?? "";
|
|
112
|
+
if (!botToken.startsWith("xoxb-"))
|
|
113
|
+
throw new ConnectError("Enter the app's Bot User OAuth Token, which starts with xoxb- (Install App in the app's settings)");
|
|
114
|
+
const { response } = await send(botToken, { method: "GET", path: "/auth.test" });
|
|
115
|
+
const d = response.data;
|
|
116
|
+
if (response.status === 401)
|
|
117
|
+
throw new ConnectError("Slack did not accept the token");
|
|
118
|
+
if (response.status !== 200 || typeof d?.team_id !== "string")
|
|
119
|
+
throw new ConnectError(`Slack sign-in failed. ${slackError(response)}`);
|
|
120
|
+
const url = typeof d.url === "string" ? d.url : "";
|
|
121
|
+
const team = typeof d.team === "string" ? d.team : d.team_id;
|
|
122
|
+
return {
|
|
123
|
+
config: { teamId: d.team_id, team, url, botUserId: String(d.user_id ?? "") },
|
|
124
|
+
secret: { bot_token: botToken },
|
|
125
|
+
accountLabel: url ? `${team} (${new URL(url).host})` : team,
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
call,
|
|
129
|
+
checks: {
|
|
130
|
+
// auth.test proves the token; Slack names its scopes in x-oauth-scopes on every answer.
|
|
131
|
+
async workspace(connection, { expected }) {
|
|
132
|
+
const { headers, response } = await send(token(connection), {
|
|
133
|
+
method: "GET",
|
|
134
|
+
path: "/auth.test",
|
|
135
|
+
});
|
|
136
|
+
if (response.status !== 200)
|
|
137
|
+
throw new ConnectError(`Slack sign-in failed. ${slackError(response)}`);
|
|
138
|
+
const d = response.data;
|
|
139
|
+
const has = new Set((headers.get("x-oauth-scopes") ?? "").split(",").map((s) => s.trim()));
|
|
140
|
+
const missing = expected.filter((s) => !has.has(s));
|
|
141
|
+
return {
|
|
142
|
+
values: [d.url ? `${d.team} (${new URL(d.url).host})` : String(d.team)],
|
|
143
|
+
...(missing.length
|
|
144
|
+
? {
|
|
145
|
+
warning: `The Slack app is missing these bot scopes: ${missing.join(", ")}. Add them under OAuth & Permissions, reinstall the app to the workspace, then check again.`,
|
|
146
|
+
}
|
|
147
|
+
: {}),
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
async channels(connection) {
|
|
151
|
+
return { values: (await memberChannels(call, connection)).map((c) => c.id) };
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// Every channel the bot is a member of, for the admin's limit choices: at most 5 pages of 200.
|
|
157
|
+
export async function memberChannels(call, connection) {
|
|
158
|
+
const out = [];
|
|
159
|
+
let cursor = "";
|
|
160
|
+
for (let page = 0; page < 5; page++) {
|
|
161
|
+
const res = await call(connection, {
|
|
162
|
+
method: "GET",
|
|
163
|
+
path: `/users.conversations?${channelQuery(200, cursor)}`,
|
|
164
|
+
});
|
|
165
|
+
if (res.status !== 200)
|
|
166
|
+
throw new ConnectError(slackError(res));
|
|
167
|
+
const d = res.data;
|
|
168
|
+
out.push(...(d.channels ?? []));
|
|
169
|
+
cursor = d.response_metadata?.next_cursor ?? "";
|
|
170
|
+
if (!cursor)
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
export const channelQuery = (limit, cursor = "") => new URLSearchParams({
|
|
176
|
+
types: "public_channel,private_channel",
|
|
177
|
+
exclude_archived: "true",
|
|
178
|
+
limit: String(limit),
|
|
179
|
+
...(cursor ? { cursor } : {}),
|
|
180
|
+
}).toString();
|
|
181
|
+
function refusal(data) {
|
|
182
|
+
if (!data || typeof data !== "object")
|
|
183
|
+
return null;
|
|
184
|
+
const d = data;
|
|
185
|
+
return d.ok === false ? (typeof d.error === "string" ? d.error : "unknown_error") : null;
|
|
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/slack/vendor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Toolset } from "../../packages/connector-kit/src/common.js";
|
|
2
|
+
import { type Connector, type SoapApp, type SoapTool } from "../../packages/connector-kit/src/connector.js";
|
|
3
|
+
import { type Fetch, type Vendor } from "../../packages/connector-kit/src/types.js";
|
|
4
|
+
export declare function renderBody(tool: SoapTool, args: Record<string, unknown>): string;
|
|
5
|
+
export declare function soapVendor(connector: Connector, fetchImpl?: Fetch): Vendor;
|
|
6
|
+
export declare function answer(tool: SoapTool, body: unknown): unknown;
|
|
7
|
+
export declare function soapTools(soap: SoapApp): Toolset;
|
|
8
|
+
/** Binds to any connector with a `soap` block; createAgentConnect uses it for those. */
|
|
9
|
+
declare const _default: {
|
|
10
|
+
id: string;
|
|
11
|
+
create: ({ connector }: {
|
|
12
|
+
microsoft: import("../microsoft/client.js").MicrosoftClient;
|
|
13
|
+
connector: Connector;
|
|
14
|
+
}) => {
|
|
15
|
+
vendor: Vendor;
|
|
16
|
+
toolset: Toolset;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export default _default;
|