crewly 1.20.247 → 1.20.249
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/config/skills/agent/core/list-channels/SKILL.md +61 -0
- package/config/skills/agent/core/list-channels/execute.sh +36 -0
- package/config/skills/agent/core/list-channels/execute.test.sh +17 -0
- package/config/skills/agent/core/reply-channel/SKILL.md +10 -0
- package/config/skills/agent/core/reply-channel/execute.sh +23 -1
- package/config/skills/agent/core/reply-channel/execute.test.sh +25 -0
- package/dist/backend/backend/src/constants.d.ts +56 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +56 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/channels/channels.routes.d.ts +27 -0
- package/dist/backend/backend/src/controllers/channels/channels.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/channels/channels.routes.js +99 -0
- package/dist/backend/backend/src/controllers/channels/channels.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +1 -0
- package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.controller.js +7 -0
- package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.routes.d.ts +1 -0
- package/dist/backend/backend/src/controllers/connector/connector.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.routes.js +7 -0
- package/dist/backend/backend/src/controllers/connector/connector.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts +55 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js +148 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +18 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +5 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/channels/crewly-channel.service.d.ts +247 -0
- package/dist/backend/backend/src/services/channels/crewly-channel.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/channels/crewly-channel.service.js +631 -0
- package/dist/backend/backend/src/services/channels/crewly-channel.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +26 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +40 -2
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/connector/connector-access.service.d.ts +8 -0
- package/dist/backend/backend/src/services/connector/connector-access.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/connector/connector-access.service.js +17 -0
- package/dist/backend/backend/src/services/connector/connector-access.service.js.map +1 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts +77 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js +132 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts +75 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js +155 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp.service.d.ts +192 -0
- package/dist/backend/backend/src/services/connector/remote-mcp.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp.service.js +334 -0
- package/dist/backend/backend/src/services/connector/remote-mcp.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/credential-files.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/credential-files.js +4 -1
- package/dist/backend/backend/src/services/core/credential-files.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-channel-members.d.ts +60 -0
- package/dist/backend/backend/src/services/slack/slack-channel-members.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-channel-members.js +70 -0
- package/dist/backend/backend/src/services/slack/slack-channel-members.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +147 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +423 -12
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +10 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +15 -0
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/types/crewly-channel.types.d.ts +77 -0
- package/dist/backend/backend/src/types/crewly-channel.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/crewly-channel.types.js +35 -0
- package/dist/backend/backend/src/types/crewly-channel.types.js.map +1 -0
- package/dist/backend/backend/src/types/slack.types.d.ts +7 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +56 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +56 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +5 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +26 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +40 -2
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/connector/connector-access.service.d.ts +85 -0
- package/dist/cli/backend/src/services/connector/connector-access.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/connector/connector-access.service.js +130 -0
- package/dist/cli/backend/src/services/connector/connector-access.service.js.map +1 -0
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts +77 -0
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js +132 -0
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -0
- package/dist/cli/backend/src/services/connector/remote-mcp.service.d.ts +192 -0
- package/dist/cli/backend/src/services/connector/remote-mcp.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/connector/remote-mcp.service.js +334 -0
- package/dist/cli/backend/src/services/connector/remote-mcp.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/credential-files.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/credential-files.js +4 -1
- package/dist/cli/backend/src/services/core/credential-files.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-channel-members.d.ts +87 -0
- package/dist/cli/backend/src/services/slack/slack-channel-members.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-channel-members.js +124 -0
- package/dist/cli/backend/src/services/slack/slack-channel-members.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +147 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +423 -12
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +10 -0
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +15 -0
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +7 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/frontend/dist/assets/{index-c9630c55.js → index-2db17f1e.js} +292 -292
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote MCP servers — streamable-HTTP MCP servers the owner connects once
|
|
3
|
+
* (Zoho MCP first, any other server the same way) and Crewly hands to every
|
|
4
|
+
* agent whose role may use them.
|
|
5
|
+
*
|
|
6
|
+
* Stored at `<CREWLY_HOME>/remote-mcp-servers.json` with mode 0600. The URL
|
|
7
|
+
* (Zoho's carries the server's API key) and any headers are secrets: they
|
|
8
|
+
* are never logged, never returned in full by {@link toView}, and never
|
|
9
|
+
* written into a project directory (a project `.mcp.json` would be
|
|
10
|
+
* committed). Agents get them through per-session files under CREWLY_HOME
|
|
11
|
+
* (see remote-mcp-launch.service).
|
|
12
|
+
*
|
|
13
|
+
* Each server is a gated connector `mcp:<id>` in
|
|
14
|
+
* {@link ConnectorAccessService}: open to every agent until the owner picks
|
|
15
|
+
* roles.
|
|
16
|
+
*
|
|
17
|
+
* @module services/connector/remote-mcp.service
|
|
18
|
+
*/
|
|
19
|
+
import * as fs from 'fs/promises';
|
|
20
|
+
import * as path from 'path';
|
|
21
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
22
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
23
|
+
import { REMOTE_MCP_CONSTANTS } from '../../constants.js';
|
|
24
|
+
import { ConnectorAccessService } from './connector-access.service.js';
|
|
25
|
+
const C = REMOTE_MCP_CONSTANTS;
|
|
26
|
+
/** A validation failure the API turns into a 400. */
|
|
27
|
+
export class RemoteMcpValidationError extends Error {
|
|
28
|
+
constructor(message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = 'RemoteMcpValidationError';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The connector-access id of a server.
|
|
35
|
+
*
|
|
36
|
+
* @param id - Server id
|
|
37
|
+
* @returns `mcp:<id>`
|
|
38
|
+
*/
|
|
39
|
+
export function remoteMcpConnectorId(id) {
|
|
40
|
+
return `${C.CONNECTOR_PREFIX}${id}`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Show a URL without its secret parts: scheme and host only.
|
|
44
|
+
*
|
|
45
|
+
* @param url - Stored URL
|
|
46
|
+
* @returns e.g. `https://crm-123.zohomcp.com/…`, or `(hidden)` when it does not parse
|
|
47
|
+
*/
|
|
48
|
+
export function maskRemoteMcpUrl(url) {
|
|
49
|
+
try {
|
|
50
|
+
const u = new URL(url);
|
|
51
|
+
return `${u.protocol}//${u.host}/…`;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return '(hidden)';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validate a server URL: https (http only for localhost), no whitespace,
|
|
59
|
+
* quotes or backslashes (it is embedded in launch files), bounded length.
|
|
60
|
+
*
|
|
61
|
+
* @param raw - Pasted URL
|
|
62
|
+
* @returns The trimmed URL
|
|
63
|
+
* @throws RemoteMcpValidationError when it is not usable (message never echoes the URL)
|
|
64
|
+
*/
|
|
65
|
+
export function validateRemoteMcpUrl(raw) {
|
|
66
|
+
const url = typeof raw === 'string' ? raw.trim() : '';
|
|
67
|
+
if (!url)
|
|
68
|
+
throw new RemoteMcpValidationError('Paste the server URL.');
|
|
69
|
+
if (url.length > C.MAX_URL_LENGTH)
|
|
70
|
+
throw new RemoteMcpValidationError('That URL is too long.');
|
|
71
|
+
if (/[\s"'`\\<>]/.test(url) || /[\u0000-\u001f\u007f]/.test(url)) {
|
|
72
|
+
throw new RemoteMcpValidationError('That URL contains spaces or quotes — paste only the URL.');
|
|
73
|
+
}
|
|
74
|
+
let parsed;
|
|
75
|
+
try {
|
|
76
|
+
parsed = new URL(url);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
throw new RemoteMcpValidationError('That is not a valid URL.');
|
|
80
|
+
}
|
|
81
|
+
const local = ['localhost', '127.0.0.1', '[::1]'].includes(parsed.hostname);
|
|
82
|
+
if (parsed.protocol !== 'https:' && !(parsed.protocol === 'http:' && local)) {
|
|
83
|
+
throw new RemoteMcpValidationError('The URL must start with https://');
|
|
84
|
+
}
|
|
85
|
+
return url;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validate optional headers: token-shaped names, single-line values.
|
|
89
|
+
*
|
|
90
|
+
* @param raw - Headers object or undefined
|
|
91
|
+
* @returns Clean headers, or undefined when none
|
|
92
|
+
* @throws RemoteMcpValidationError on a bad name or value
|
|
93
|
+
*/
|
|
94
|
+
export function validateRemoteMcpHeaders(raw) {
|
|
95
|
+
if (raw === undefined || raw === null)
|
|
96
|
+
return undefined;
|
|
97
|
+
if (typeof raw !== 'object' || Array.isArray(raw))
|
|
98
|
+
throw new RemoteMcpValidationError('headers must be an object of name → value.');
|
|
99
|
+
const out = {};
|
|
100
|
+
for (const [name, value] of Object.entries(raw)) {
|
|
101
|
+
if (!/^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,64}$/.test(name))
|
|
102
|
+
throw new RemoteMcpValidationError(`Header name "${name.slice(0, 64)}" is not valid.`);
|
|
103
|
+
if (typeof value !== 'string' || /[\r\n\u0000]/.test(value) || value.length > 4096) {
|
|
104
|
+
throw new RemoteMcpValidationError(`Header "${name}" needs a single-line text value.`);
|
|
105
|
+
}
|
|
106
|
+
out[name] = value;
|
|
107
|
+
}
|
|
108
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Clean a label.
|
|
112
|
+
*
|
|
113
|
+
* @param raw - Label input
|
|
114
|
+
* @returns Trimmed label
|
|
115
|
+
* @throws RemoteMcpValidationError when empty
|
|
116
|
+
*/
|
|
117
|
+
export function normalizeRemoteMcpLabel(raw) {
|
|
118
|
+
const label = (typeof raw === 'string' ? raw : '').replace(/\s+/g, ' ').trim().slice(0, C.MAX_LABEL_LENGTH);
|
|
119
|
+
if (!label)
|
|
120
|
+
throw new RemoteMcpValidationError('Give the server a name.');
|
|
121
|
+
return label;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Derive an id (MCP server name) from a label: lowercase slug, unique.
|
|
125
|
+
*
|
|
126
|
+
* @param label - Label
|
|
127
|
+
* @param taken - Ids already in use
|
|
128
|
+
* @returns e.g. `zoho`, `zoho-2`
|
|
129
|
+
*/
|
|
130
|
+
export function deriveRemoteMcpId(label, taken) {
|
|
131
|
+
let base = label.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 32);
|
|
132
|
+
if (!base || !/^[a-z0-9]/.test(base))
|
|
133
|
+
base = 'mcp';
|
|
134
|
+
let id = base;
|
|
135
|
+
for (let n = 2; taken.has(id); n++)
|
|
136
|
+
id = `${base}-${n}`;
|
|
137
|
+
return id;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Turn a stored server into its API shape.
|
|
141
|
+
*
|
|
142
|
+
* @param server - Stored server
|
|
143
|
+
* @returns The view (no URL, no header values)
|
|
144
|
+
*/
|
|
145
|
+
export function toView(server) {
|
|
146
|
+
return {
|
|
147
|
+
id: server.id,
|
|
148
|
+
label: server.label,
|
|
149
|
+
provider: server.provider ?? 'custom',
|
|
150
|
+
urlMasked: maskRemoteMcpUrl(server.url),
|
|
151
|
+
headerNames: Object.keys(server.headers ?? {}),
|
|
152
|
+
createdAt: server.createdAt,
|
|
153
|
+
connectorId: remoteMcpConnectorId(server.id),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Reads and writes the remote MCP server store.
|
|
158
|
+
*/
|
|
159
|
+
export class RemoteMcpService {
|
|
160
|
+
static instance = null;
|
|
161
|
+
logger;
|
|
162
|
+
filePath;
|
|
163
|
+
access;
|
|
164
|
+
writeChain = Promise.resolve();
|
|
165
|
+
/**
|
|
166
|
+
* @param crewlyHome - Override the home directory (tests)
|
|
167
|
+
* @param access - Connector access service (tests)
|
|
168
|
+
*/
|
|
169
|
+
constructor(crewlyHome, access) {
|
|
170
|
+
this.logger = LoggerService.getInstance().createComponentLogger('RemoteMcp');
|
|
171
|
+
this.filePath = path.join(crewlyHome || getCrewlyHomePath(), C.STORE_FILE);
|
|
172
|
+
this.access = () => access ?? ConnectorAccessService.getInstance();
|
|
173
|
+
}
|
|
174
|
+
static getInstance() {
|
|
175
|
+
if (!RemoteMcpService.instance)
|
|
176
|
+
RemoteMcpService.instance = new RemoteMcpService();
|
|
177
|
+
return RemoteMcpService.instance;
|
|
178
|
+
}
|
|
179
|
+
/** Reset the singleton (tests). */
|
|
180
|
+
static resetInstance() {
|
|
181
|
+
RemoteMcpService.instance = null;
|
|
182
|
+
}
|
|
183
|
+
/** Absolute path of the store file. */
|
|
184
|
+
getFilePath() {
|
|
185
|
+
return this.filePath;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Every stored server, with secrets. Unreadable entries are dropped.
|
|
189
|
+
*
|
|
190
|
+
* @returns Servers in the order they were added
|
|
191
|
+
*/
|
|
192
|
+
async list() {
|
|
193
|
+
let raw;
|
|
194
|
+
try {
|
|
195
|
+
raw = await fs.readFile(this.filePath, 'utf8');
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
if (err.code === 'ENOENT')
|
|
199
|
+
return [];
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
let parsed;
|
|
203
|
+
try {
|
|
204
|
+
parsed = JSON.parse(raw);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
this.logger.error('Remote MCP store is not valid JSON — treating it as empty', { file: this.filePath });
|
|
208
|
+
return [];
|
|
209
|
+
}
|
|
210
|
+
const servers = parsed?.servers;
|
|
211
|
+
if (!Array.isArray(servers))
|
|
212
|
+
return [];
|
|
213
|
+
return servers.filter((s) => !!s && typeof s.id === 'string' && C.ID_PATTERN.test(s.id) && typeof s.url === 'string' && typeof s.label === 'string');
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* One server, with secrets.
|
|
217
|
+
*
|
|
218
|
+
* @param id - Server id
|
|
219
|
+
* @returns The server or undefined
|
|
220
|
+
*/
|
|
221
|
+
async get(id) {
|
|
222
|
+
return (await this.list()).find((s) => s.id === id);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Add a server.
|
|
226
|
+
*
|
|
227
|
+
* @param input - Label, URL, optional headers and provider
|
|
228
|
+
* @returns The stored server
|
|
229
|
+
* @throws RemoteMcpValidationError on bad input or a full store
|
|
230
|
+
*/
|
|
231
|
+
async add(input) {
|
|
232
|
+
const label = normalizeRemoteMcpLabel(input.label);
|
|
233
|
+
const url = validateRemoteMcpUrl(input.url);
|
|
234
|
+
const headers = validateRemoteMcpHeaders(input.headers);
|
|
235
|
+
const provider = input.provider === 'zoho' ? 'zoho' : 'custom';
|
|
236
|
+
return this.mutate(async (servers) => {
|
|
237
|
+
if (servers.length >= C.MAX_SERVERS)
|
|
238
|
+
throw new RemoteMcpValidationError(`At most ${C.MAX_SERVERS} servers.`);
|
|
239
|
+
if (servers.some((s) => s.url === url))
|
|
240
|
+
throw new RemoteMcpValidationError('That server is already connected.');
|
|
241
|
+
const id = deriveRemoteMcpId(label, new Set(servers.map((s) => s.id)));
|
|
242
|
+
const server = { id, label, url, ...(headers ? { headers } : {}), provider, createdAt: new Date().toISOString() };
|
|
243
|
+
this.logger.info('Remote MCP server added', { id, provider, host: maskRemoteMcpUrl(url) });
|
|
244
|
+
return { servers: [...servers, server], result: server };
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Rename a server (its id, and so its MCP name and allowlist, stay).
|
|
249
|
+
*
|
|
250
|
+
* @param id - Server id
|
|
251
|
+
* @param label - New label
|
|
252
|
+
* @returns The updated server, or undefined when there is none
|
|
253
|
+
*/
|
|
254
|
+
async rename(id, label) {
|
|
255
|
+
const clean = normalizeRemoteMcpLabel(label);
|
|
256
|
+
return this.mutate(async (servers) => {
|
|
257
|
+
const idx = servers.findIndex((s) => s.id === id);
|
|
258
|
+
if (idx < 0)
|
|
259
|
+
return { servers, result: undefined };
|
|
260
|
+
const next = [...servers];
|
|
261
|
+
next[idx] = { ...next[idx], label: clean };
|
|
262
|
+
this.logger.info('Remote MCP server renamed', { id });
|
|
263
|
+
return { servers: next, result: next[idx] };
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Remove a server and its allowlist.
|
|
268
|
+
*
|
|
269
|
+
* @param id - Server id
|
|
270
|
+
* @returns True when it existed
|
|
271
|
+
*/
|
|
272
|
+
async remove(id) {
|
|
273
|
+
const removed = await this.mutate(async (servers) => {
|
|
274
|
+
const next = servers.filter((s) => s.id !== id);
|
|
275
|
+
return { servers: next, result: next.length !== servers.length };
|
|
276
|
+
});
|
|
277
|
+
if (removed) {
|
|
278
|
+
await this.access().removeRule(remoteMcpConnectorId(id));
|
|
279
|
+
this.logger.info('Remote MCP server removed', { id });
|
|
280
|
+
}
|
|
281
|
+
return removed;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Servers an agent role may use (its `mcp:<id>` allowlist passes).
|
|
285
|
+
*
|
|
286
|
+
* @param role - Agent role
|
|
287
|
+
* @returns Allowed servers, with secrets
|
|
288
|
+
*/
|
|
289
|
+
async serversForRole(role) {
|
|
290
|
+
const servers = await this.list();
|
|
291
|
+
const out = [];
|
|
292
|
+
for (const s of servers) {
|
|
293
|
+
// An empty role must not read as "the owner" here: launch always has one.
|
|
294
|
+
if (await this.access().isAllowed(remoteMcpConnectorId(s.id), role || 'unknown'))
|
|
295
|
+
out.push(s);
|
|
296
|
+
}
|
|
297
|
+
return out;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Serialised read-modify-write; the file is written 0600.
|
|
301
|
+
*
|
|
302
|
+
* @param fn - Change to apply
|
|
303
|
+
* @returns The change's result
|
|
304
|
+
*/
|
|
305
|
+
async mutate(fn) {
|
|
306
|
+
const run = this.writeChain.then(async () => {
|
|
307
|
+
const { servers, result } = await fn(await this.list());
|
|
308
|
+
await writeSecretJson(this.filePath, { servers });
|
|
309
|
+
return result;
|
|
310
|
+
});
|
|
311
|
+
this.writeChain = run.catch(() => undefined);
|
|
312
|
+
return run;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Write JSON readable only by the owner (0600), atomically.
|
|
317
|
+
*
|
|
318
|
+
* @param filePath - Destination
|
|
319
|
+
* @param data - JSON value
|
|
320
|
+
*/
|
|
321
|
+
export async function writeSecretJson(filePath, data) {
|
|
322
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
323
|
+
const tmp = `${filePath}.tmp.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}`;
|
|
324
|
+
try {
|
|
325
|
+
await fs.writeFile(tmp, `${JSON.stringify(data, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
|
|
326
|
+
await fs.chmod(tmp, 0o600);
|
|
327
|
+
await fs.rename(tmp, filePath);
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
await fs.rm(tmp, { force: true }).catch(() => undefined);
|
|
331
|
+
throw err;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=remote-mcp.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-mcp.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-files.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/core/credential-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC3B,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,WAAW,EAAE,OAAO,CAAC;CACrB;AAaD;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"credential-files.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/core/credential-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC3B,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,WAAW,EAAE,OAAO,CAAC;CACrB;AAaD;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,WAAW,EAAE,CA6BzD"}
|
|
@@ -12,7 +12,7 @@ import * as os from 'os';
|
|
|
12
12
|
import * as path from 'path';
|
|
13
13
|
import { getCrewlyHomePath } from './crewly-home.utils.js';
|
|
14
14
|
import { getApiTokenFilePath } from './api-token.service.js';
|
|
15
|
-
import { HARNESS_CONSTANTS, SLACK_AGENT_IDENTITY_CONSTANTS, SLACK_CLOUD_CONSTANTS, TELEGRAM_CONSTANTS, WHATSAPP_CONSTANTS } from '../../constants.js';
|
|
15
|
+
import { HARNESS_CONSTANTS, REMOTE_MCP_CONSTANTS, SLACK_AGENT_IDENTITY_CONSTANTS, SLACK_CLOUD_CONSTANTS, TELEGRAM_CONSTANTS, WHATSAPP_CONSTANTS } from '../../constants.js';
|
|
16
16
|
import { CREWLY_CONSTANTS } from '../../../../config/constants.js';
|
|
17
17
|
/**
|
|
18
18
|
* `~/.crewly` as the modules that ignore CREWLY_HOME build it (Slack and
|
|
@@ -55,6 +55,9 @@ export function getGuardedCredentialPaths() {
|
|
|
55
55
|
add('credential-store', path.join(home, 'credentials'), true);
|
|
56
56
|
add('whatsapp-session', path.join(home, WHATSAPP_CONSTANTS.AUTH_DIR), true);
|
|
57
57
|
add('claude-accounts', path.join(home, HARNESS_CONSTANTS.CLAUDE.ACCOUNTS.DIR), true);
|
|
58
|
+
// Remote MCP server URLs carry their key (Zoho MCP); runtimes read the launch files themselves.
|
|
59
|
+
add('remote-mcp-servers', path.join(home, REMOTE_MCP_CONSTANTS.STORE_FILE), false);
|
|
60
|
+
add('remote-mcp-launch-files', path.join(home, REMOTE_MCP_CONSTANTS.RUNTIME_DIR), true);
|
|
58
61
|
return out;
|
|
59
62
|
}
|
|
60
63
|
//# sourceMappingURL=credential-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-files.js","sourceRoot":"","sources":["../../../../../../backend/src/services/core/credential-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"credential-files.js","sourceRoot":"","sources":["../../../../../../backend/src/services/core/credential-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,4 +24,64 @@ export type ChannelMembersResult = {
|
|
|
24
24
|
* mean this bot is not in the channel)
|
|
25
25
|
*/
|
|
26
26
|
export declare function listChannelMembersWithToken(channelId: string, token: string, fetchImpl?: typeof fetch): Promise<ChannelMembersResult>;
|
|
27
|
+
/** Result of a single Slack Web API call made with a bot token. */
|
|
28
|
+
export type SlackTokenCallResult = {
|
|
29
|
+
ok: true;
|
|
30
|
+
body: Record<string, unknown>;
|
|
31
|
+
} | {
|
|
32
|
+
ok: false;
|
|
33
|
+
error: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* One Slack Web API call (form-encoded POST) with a specific bot token.
|
|
37
|
+
* Never throws: network failures and Slack refusals come back as `error`.
|
|
38
|
+
*
|
|
39
|
+
* Used for the channel operations an agent's own bot can do in a room the
|
|
40
|
+
* workspace bot is not in (a private channel the owner invited agents to):
|
|
41
|
+
* read its name, invite another agent's bot, leave, rename.
|
|
42
|
+
*
|
|
43
|
+
* @param method - Web API method, e.g. `conversations.info`
|
|
44
|
+
* @param params - Form fields
|
|
45
|
+
* @param token - A bot token
|
|
46
|
+
* @param fetchImpl - fetch (injectable for tests)
|
|
47
|
+
* @returns The response body, or Slack's error code
|
|
48
|
+
*/
|
|
49
|
+
export declare function slackCallWithToken(method: string, params: Record<string, string>, token: string, fetchImpl?: typeof fetch): Promise<SlackTokenCallResult>;
|
|
50
|
+
/** Channel operations with an agent's own bot token (see {@link slackCallWithToken}). */
|
|
51
|
+
export interface ChannelTokenOps {
|
|
52
|
+
/** `conversations.info` → the channel's current name. */
|
|
53
|
+
info(channelId: string, token: string): Promise<{
|
|
54
|
+
ok: true;
|
|
55
|
+
name: string;
|
|
56
|
+
isArchived: boolean;
|
|
57
|
+
} | {
|
|
58
|
+
ok: false;
|
|
59
|
+
error: string;
|
|
60
|
+
}>;
|
|
61
|
+
/** `conversations.invite` → put a user (another agent's bot) into the channel. */
|
|
62
|
+
invite(channelId: string, userId: string, token: string): Promise<{
|
|
63
|
+
ok: boolean;
|
|
64
|
+
error?: string;
|
|
65
|
+
}>;
|
|
66
|
+
/** `conversations.leave` → the token's own bot leaves the channel. */
|
|
67
|
+
leave(channelId: string, token: string): Promise<{
|
|
68
|
+
ok: boolean;
|
|
69
|
+
error?: string;
|
|
70
|
+
}>;
|
|
71
|
+
/** `conversations.rename` → the name Slack applied. */
|
|
72
|
+
rename(channelId: string, name: string, token: string): Promise<{
|
|
73
|
+
ok: true;
|
|
74
|
+
name: string;
|
|
75
|
+
} | {
|
|
76
|
+
ok: false;
|
|
77
|
+
error: string;
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The default {@link ChannelTokenOps}, over the real Slack Web API.
|
|
82
|
+
*
|
|
83
|
+
* @param fetchImpl - fetch (injectable for tests)
|
|
84
|
+
* @returns The ops
|
|
85
|
+
*/
|
|
86
|
+
export declare function createChannelTokenOps(fetchImpl?: typeof fetch): ChannelTokenOps;
|
|
27
87
|
//# sourceMappingURL=slack-channel-members.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-channel-members.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-channel-members.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+BAA+B;AAC/B,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAOlG;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAO,KAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0BlJ"}
|
|
1
|
+
{"version":3,"file":"slack-channel-members.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-channel-members.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+BAA+B;AAC/B,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAOlG;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,OAAO,KAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA0BlJ;AAED,mEAAmE;AACnE,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9G;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAmB/B;AAED,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChI,kFAAkF;IAClF,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnG,sEAAsE;IACtE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF,uDAAuD;IACvD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5H;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,GAAE,OAAO,KAAa,GAAG,eAAe,CAuBtF"}
|
|
@@ -51,4 +51,74 @@ export async function listChannelMembersWithToken(channelId, token, fetchImpl =
|
|
|
51
51
|
}
|
|
52
52
|
return { ok: true, members };
|
|
53
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* One Slack Web API call (form-encoded POST) with a specific bot token.
|
|
56
|
+
* Never throws: network failures and Slack refusals come back as `error`.
|
|
57
|
+
*
|
|
58
|
+
* Used for the channel operations an agent's own bot can do in a room the
|
|
59
|
+
* workspace bot is not in (a private channel the owner invited agents to):
|
|
60
|
+
* read its name, invite another agent's bot, leave, rename.
|
|
61
|
+
*
|
|
62
|
+
* @param method - Web API method, e.g. `conversations.info`
|
|
63
|
+
* @param params - Form fields
|
|
64
|
+
* @param token - A bot token
|
|
65
|
+
* @param fetchImpl - fetch (injectable for tests)
|
|
66
|
+
* @returns The response body, or Slack's error code
|
|
67
|
+
*/
|
|
68
|
+
export async function slackCallWithToken(method, params, token, fetchImpl = fetch) {
|
|
69
|
+
const controller = new AbortController();
|
|
70
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
71
|
+
try {
|
|
72
|
+
const res = await fetchImpl(`https://slack.com/api/${method}`, {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
75
|
+
body: new URLSearchParams(params).toString(),
|
|
76
|
+
signal: controller.signal,
|
|
77
|
+
});
|
|
78
|
+
if (res.status === 429)
|
|
79
|
+
return { ok: false, error: 'rate_limited' };
|
|
80
|
+
const body = (await res.json());
|
|
81
|
+
if (!body?.ok)
|
|
82
|
+
return { ok: false, error: body?.error ?? `http_${res.status}` };
|
|
83
|
+
return { ok: true, body };
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
clearTimeout(timer);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The default {@link ChannelTokenOps}, over the real Slack Web API.
|
|
94
|
+
*
|
|
95
|
+
* @param fetchImpl - fetch (injectable for tests)
|
|
96
|
+
* @returns The ops
|
|
97
|
+
*/
|
|
98
|
+
export function createChannelTokenOps(fetchImpl = fetch) {
|
|
99
|
+
const channelOf = (body) => (body.channel ?? {});
|
|
100
|
+
return {
|
|
101
|
+
async info(channelId, token) {
|
|
102
|
+
const r = await slackCallWithToken('conversations.info', { channel: channelId }, token, fetchImpl);
|
|
103
|
+
if (!r.ok)
|
|
104
|
+
return r;
|
|
105
|
+
const ch = channelOf(r.body);
|
|
106
|
+
return { ok: true, name: ch.name ?? '', isArchived: ch.is_archived === true };
|
|
107
|
+
},
|
|
108
|
+
async invite(channelId, userId, token) {
|
|
109
|
+
const r = await slackCallWithToken('conversations.invite', { channel: channelId, users: userId }, token, fetchImpl);
|
|
110
|
+
return r.ok ? { ok: true } : { ok: false, error: r.error };
|
|
111
|
+
},
|
|
112
|
+
async leave(channelId, token) {
|
|
113
|
+
const r = await slackCallWithToken('conversations.leave', { channel: channelId }, token, fetchImpl);
|
|
114
|
+
return r.ok ? { ok: true } : { ok: false, error: r.error };
|
|
115
|
+
},
|
|
116
|
+
async rename(channelId, name, token) {
|
|
117
|
+
const r = await slackCallWithToken('conversations.rename', { channel: channelId, name }, token, fetchImpl);
|
|
118
|
+
if (!r.ok)
|
|
119
|
+
return r;
|
|
120
|
+
return { ok: true, name: channelOf(r.body).name ?? name };
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
54
124
|
//# sourceMappingURL=slack-channel-members.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-channel-members.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-channel-members.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,6CAA6C;AAC7C,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,GAAG,GAAG,6CAA6C,CAAC;AAC1D,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,SAAiB,EAAE,KAAa,EAAE,YAA0B,KAAK;IACjH,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACxG,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE;gBACzD,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;YACpE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuG,CAAC;YACtI,IAAI,CAAC,IAAI,EAAE,EAAE;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5D,IAAI,CAAC,MAAM;gBAAE,MAAM;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAChF,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}
|
|
1
|
+
{"version":3,"file":"slack-channel-members.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-channel-members.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module services/slack/initializer
|
|
8
8
|
*/
|
|
9
|
-
import { listChannelMembersWithToken } from './slack-channel-members.js';
|
|
9
|
+
import { createChannelTokenOps, listChannelMembersWithToken } from './slack-channel-members.js';
|
|
10
10
|
import { SlackDeliveryAuditService, getSlackDeliveryAuditService, setSlackDeliveryAuditService } from './slack-delivery-audit.service.js';
|
|
11
11
|
import { getSlackService } from './slack.service.js';
|
|
12
12
|
import { getSlackOrchestratorBridge } from './slack-orchestrator-bridge.js';
|
|
@@ -895,6 +895,7 @@ export async function startSlackTeamChannels() {
|
|
|
895
895
|
resolveInstanceId: async () => getSlackInstanceRegistryService()?.resolveInstanceId() ?? null,
|
|
896
896
|
onRoomsChanged: () => getSlackInstanceRegistryService()?.requestHeartbeat(),
|
|
897
897
|
listChannelMembers: (channelId, botToken) => listChannelMembersWithToken(channelId, botToken),
|
|
898
|
+
channelOps: createChannelTokenOps(),
|
|
898
899
|
refreshIdentities: () => identities.refreshFromCloud(),
|
|
899
900
|
handoffViaCloud: async (body) => {
|
|
900
901
|
const registry = getSlackInstanceRegistryService();
|