crewly 1.20.265 → 1.20.267

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.
Files changed (125) hide show
  1. package/config/skills/_common/lib.sh +15 -2
  2. package/config/skills/agent/core/app-data/SKILL.md +13 -1
  3. package/config/skills/agent/core/app-data/execute.sh +41 -5
  4. package/config/skills/agent/core/app-data/execute.test.sh +47 -1
  5. package/config/skills/agent/core/publish-app/SKILL.md +1 -1
  6. package/config/skills/agent/core/slack-file/SKILL.md +53 -0
  7. package/config/skills/agent/core/slack-file/execute.sh +72 -0
  8. package/config/skills/agent/core/slack-file/execute.test.sh +34 -0
  9. package/dist/backend/backend/src/constants.d.ts +59 -0
  10. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  11. package/dist/backend/backend/src/constants.js +59 -0
  12. package/dist/backend/backend/src/constants.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts +7 -0
  14. package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts.map +1 -1
  15. package/dist/backend/backend/src/controllers/apps/apps.controller.js +23 -0
  16. package/dist/backend/backend/src/controllers/apps/apps.controller.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts +9 -0
  18. package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts.map +1 -1
  19. package/dist/backend/backend/src/controllers/apps/apps.routes.js +19 -1
  20. package/dist/backend/backend/src/controllers/apps/apps.routes.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/connector/connector.routes.d.ts.map +1 -1
  22. package/dist/backend/backend/src/controllers/connector/connector.routes.js +6 -1
  23. package/dist/backend/backend/src/controllers/connector/connector.routes.js.map +1 -1
  24. package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts +69 -0
  25. package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts.map +1 -0
  26. package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js +203 -0
  27. package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js.map +1 -0
  28. package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts +16 -0
  29. package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js +126 -5
  31. package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js.map +1 -1
  32. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  33. package/dist/backend/backend/src/controllers/slack/slack.controller.js +37 -0
  34. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  35. package/dist/backend/backend/src/index.d.ts.map +1 -1
  36. package/dist/backend/backend/src/index.js +5 -0
  37. package/dist/backend/backend/src/index.js.map +1 -1
  38. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
  40. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  41. package/dist/backend/backend/src/services/apps/apps-cloud.client.d.ts +2 -0
  42. package/dist/backend/backend/src/services/apps/apps-cloud.client.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/apps/apps-cloud.client.js +1 -0
  44. package/dist/backend/backend/src/services/apps/apps-cloud.client.js.map +1 -1
  45. package/dist/backend/backend/src/services/apps/apps.service.d.ts +17 -0
  46. package/dist/backend/backend/src/services/apps/apps.service.d.ts.map +1 -1
  47. package/dist/backend/backend/src/services/apps/apps.service.js +24 -0
  48. package/dist/backend/backend/src/services/apps/apps.service.js.map +1 -1
  49. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  50. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +4 -3
  51. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  52. package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.d.ts +43 -0
  53. package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.d.ts.map +1 -0
  54. package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.js +98 -0
  55. package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.js.map +1 -0
  56. package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.d.ts +277 -0
  57. package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.js +719 -0
  59. package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.js.map +1 -0
  60. package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts +29 -5
  61. package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -1
  62. package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js +40 -12
  63. package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -1
  64. package/dist/backend/backend/src/services/connector/remote-mcp-oauth.d.ts +196 -0
  65. package/dist/backend/backend/src/services/connector/remote-mcp-oauth.d.ts.map +1 -0
  66. package/dist/backend/backend/src/services/connector/remote-mcp-oauth.js +351 -0
  67. package/dist/backend/backend/src/services/connector/remote-mcp-oauth.js.map +1 -0
  68. package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts +3 -1
  69. package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts.map +1 -1
  70. package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js +8 -0
  71. package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js.map +1 -1
  72. package/dist/backend/backend/src/services/core/credential-files.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/core/credential-files.js +2 -0
  74. package/dist/backend/backend/src/services/core/credential-files.js.map +1 -1
  75. package/dist/backend/backend/src/services/slack/slack-file-fetch.service.d.ts +119 -0
  76. package/dist/backend/backend/src/services/slack/slack-file-fetch.service.d.ts.map +1 -0
  77. package/dist/backend/backend/src/services/slack/slack-file-fetch.service.js +415 -0
  78. package/dist/backend/backend/src/services/slack/slack-file-fetch.service.js.map +1 -0
  79. package/dist/backend/backend/src/services/slack/slack-file-ref.d.ts +69 -0
  80. package/dist/backend/backend/src/services/slack/slack-file-ref.d.ts.map +1 -0
  81. package/dist/backend/backend/src/services/slack/slack-file-ref.js +177 -0
  82. package/dist/backend/backend/src/services/slack/slack-file-ref.js.map +1 -0
  83. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/slack/slack-initializer.js +16 -0
  85. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  86. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +15 -0
  87. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  88. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +84 -1
  89. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  90. package/dist/backend/backend/src/types/slack.types.d.ts +11 -0
  91. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  92. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  93. package/dist/backend/build-info.json +2 -2
  94. package/dist/cli/backend/src/constants.d.ts +59 -0
  95. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  96. package/dist/cli/backend/src/constants.js +59 -0
  97. package/dist/cli/backend/src/constants.js.map +1 -1
  98. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  99. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
  100. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  101. package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts +29 -5
  102. package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -1
  103. package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js +40 -12
  104. package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -1
  105. package/dist/cli/backend/src/services/core/credential-files.d.ts.map +1 -1
  106. package/dist/cli/backend/src/services/core/credential-files.js +2 -0
  107. package/dist/cli/backend/src/services/core/credential-files.js.map +1 -1
  108. package/dist/cli/backend/src/services/slack/slack-file-fetch.service.d.ts +119 -0
  109. package/dist/cli/backend/src/services/slack/slack-file-fetch.service.d.ts.map +1 -0
  110. package/dist/cli/backend/src/services/slack/slack-file-fetch.service.js +415 -0
  111. package/dist/cli/backend/src/services/slack/slack-file-fetch.service.js.map +1 -0
  112. package/dist/cli/backend/src/services/slack/slack-file-ref.d.ts +69 -0
  113. package/dist/cli/backend/src/services/slack/slack-file-ref.d.ts.map +1 -0
  114. package/dist/cli/backend/src/services/slack/slack-file-ref.js +177 -0
  115. package/dist/cli/backend/src/services/slack/slack-file-ref.js.map +1 -0
  116. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +15 -0
  117. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  118. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +84 -1
  119. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  120. package/dist/cli/backend/src/types/slack.types.d.ts +11 -0
  121. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  122. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  123. package/frontend/dist/assets/{index-83188f0b.js → index-7e5ebf78.js} +111 -111
  124. package/frontend/dist/index.html +1 -1
  125. package/package.json +1 -1
@@ -0,0 +1,351 @@
1
+ /**
2
+ * MCP authorization, client side: the protocol pieces a remote MCP server
3
+ * that wants OAuth needs (MCP spec "Authorization", 2025-06-18).
4
+ *
5
+ * 1. The server answers 401 with
6
+ * `WWW-Authenticate: Bearer resource_metadata="<url>"` ({@link parseWwwAuthenticate}).
7
+ * 2. Protected resource metadata (RFC 9728) names the authorization server
8
+ * ({@link fetchProtectedResourceMetadata}).
9
+ * 3. Authorization server metadata (RFC 8414, OpenID Connect discovery as a
10
+ * fallback) gives the endpoints ({@link fetchAuthorizationServerMetadata}).
11
+ * 4. Dynamic client registration (RFC 7591) when the server offers it
12
+ * ({@link registerClient}); otherwise the owner enters a client id.
13
+ * 5. Authorization code + PKCE S256 ({@link createPkcePair},
14
+ * {@link buildAuthorizeUrl}), `resource` (RFC 8707) on every request.
15
+ * 6. Code exchange and refresh ({@link exchangeCode}, {@link refreshTokens}).
16
+ *
17
+ * Pure functions over an injectable fetch. No URL, code, token or secret
18
+ * ever goes into an error message.
19
+ *
20
+ * @module services/connector/remote-mcp-oauth
21
+ */
22
+ import { createHash, randomBytes } from 'crypto';
23
+ import { REMOTE_MCP_CONSTANTS } from '../../constants.js';
24
+ const C = REMOTE_MCP_CONSTANTS;
25
+ /** An OAuth failure. `code` is stable; the message is owner-safe. */
26
+ export class RemoteMcpOAuthError extends Error {
27
+ code;
28
+ constructor(code, message) {
29
+ super(message);
30
+ this.code = code;
31
+ this.name = 'RemoteMcpOAuthError';
32
+ }
33
+ }
34
+ /**
35
+ * Parse `WWW-Authenticate` for a Bearer challenge.
36
+ *
37
+ * @param header - Header value (may hold several challenges)
38
+ * @returns The Bearer challenge's parameters, or null when there is none
39
+ */
40
+ export function parseWwwAuthenticate(header) {
41
+ if (!header)
42
+ return null;
43
+ const m = /(?:^|,\s*)Bearer\b(.*)$/i.exec(header) ?? /^\s*Bearer\b(.*)$/i.exec(header);
44
+ if (!m)
45
+ return null;
46
+ const params = {};
47
+ const re = /([A-Za-z_][A-Za-z0-9_-]*)\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([^\s,]+))/g;
48
+ let p;
49
+ while ((p = re.exec(m[1])) !== null)
50
+ params[p[1].toLowerCase()] = (p[2] ?? p[3] ?? '').replace(/\\(.)/g, '$1');
51
+ return {
52
+ ...(params['resource_metadata'] ? { resourceMetadata: params['resource_metadata'] } : {}),
53
+ ...(params['scope'] ? { scope: params['scope'] } : {}),
54
+ ...(params['error'] ? { error: params['error'] } : {}),
55
+ };
56
+ }
57
+ /**
58
+ * A discovery URL must be https (http only for a localhost server).
59
+ *
60
+ * @param raw - URL from a header or document
61
+ * @param serverUrl - The MCP server (decides whether http is acceptable)
62
+ * @returns The parsed URL, or null when unacceptable
63
+ */
64
+ export function safeDiscoveryUrl(raw, serverUrl) {
65
+ if (typeof raw !== 'string' || !raw)
66
+ return null;
67
+ try {
68
+ const u = new URL(raw);
69
+ if (u.username || u.password)
70
+ return null;
71
+ if (u.protocol === 'https:')
72
+ return u;
73
+ const local = ['localhost', '127.0.0.1', '[::1]'].includes(new URL(serverUrl).hostname);
74
+ return u.protocol === 'http:' && local && ['localhost', '127.0.0.1', '[::1]'].includes(u.hostname) ? u : null;
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ /**
81
+ * GET a JSON document.
82
+ *
83
+ * @param fetchImpl - fetch
84
+ * @param url - Where
85
+ * @returns The parsed object, or null on any failure
86
+ */
87
+ async function getJson(fetchImpl, url) {
88
+ try {
89
+ const res = await fetchImpl(url, { method: 'GET', headers: { Accept: 'application/json' }, signal: AbortSignal.timeout(C.OAUTH_REQUEST_TIMEOUT_MS) });
90
+ if (!res.ok)
91
+ return null;
92
+ const parsed = JSON.parse(await res.text());
93
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ /**
100
+ * RFC 9728 metadata: the URL the challenge named, else the well-known
101
+ * locations (path-suffixed first, then root).
102
+ *
103
+ * @param serverUrl - MCP server URL
104
+ * @param challenge - Parsed challenge, if any
105
+ * @param fetchImpl - fetch
106
+ * @returns The metadata, or null when the server publishes none
107
+ */
108
+ export async function fetchProtectedResourceMetadata(serverUrl, challenge, fetchImpl) {
109
+ const candidates = [];
110
+ const named = safeDiscoveryUrl(challenge?.resourceMetadata, serverUrl);
111
+ if (named)
112
+ candidates.push(named.toString());
113
+ const u = new URL(serverUrl);
114
+ // The path-suffixed form would carry the server's key path (Zoho), so it
115
+ // is only tried when the challenge named nothing.
116
+ if (!named) {
117
+ if (u.pathname && u.pathname !== '/')
118
+ candidates.push(`${u.origin}/.well-known/oauth-protected-resource${u.pathname.replace(/\/$/, '')}`);
119
+ candidates.push(`${u.origin}/.well-known/oauth-protected-resource`);
120
+ }
121
+ for (const url of candidates) {
122
+ const doc = await getJson(fetchImpl, url);
123
+ if (doc && Array.isArray(doc.authorization_servers) && doc.authorization_servers.length > 0)
124
+ return doc;
125
+ }
126
+ return null;
127
+ }
128
+ /**
129
+ * RFC 8414 / OIDC discovery for an issuer, in the order the MCP spec gives.
130
+ *
131
+ * @param issuer - Authorization server issuer URL
132
+ * @param serverUrl - MCP server (for the https rule)
133
+ * @param fetchImpl - fetch
134
+ * @returns The metadata
135
+ * @throws RemoteMcpOAuthError discovery_failed | pkce_unsupported
136
+ */
137
+ export async function fetchAuthorizationServerMetadata(issuer, serverUrl, fetchImpl) {
138
+ const base = safeDiscoveryUrl(issuer, serverUrl);
139
+ if (!base)
140
+ throw new RemoteMcpOAuthError('discovery_failed', 'The server named an authorization server that is not https.');
141
+ const path = base.pathname.replace(/\/$/, '');
142
+ const candidates = path
143
+ ? [
144
+ `${base.origin}/.well-known/oauth-authorization-server${path}`,
145
+ `${base.origin}/.well-known/openid-configuration${path}`,
146
+ `${base.origin}${path}/.well-known/openid-configuration`,
147
+ ]
148
+ : [`${base.origin}/.well-known/oauth-authorization-server`, `${base.origin}/.well-known/openid-configuration`];
149
+ for (const url of candidates) {
150
+ const doc = await getJson(fetchImpl, url);
151
+ if (!doc)
152
+ continue;
153
+ const auth = safeDiscoveryUrl(doc.authorization_endpoint, serverUrl);
154
+ const token = safeDiscoveryUrl(doc.token_endpoint, serverUrl);
155
+ if (!auth || !token)
156
+ continue;
157
+ const methods = doc.code_challenge_methods_supported;
158
+ if (Array.isArray(methods) && !methods.includes('S256')) {
159
+ throw new RemoteMcpOAuthError('pkce_unsupported', 'The authorization server does not support PKCE (S256), which MCP requires.');
160
+ }
161
+ const registration = safeDiscoveryUrl(doc.registration_endpoint, serverUrl);
162
+ return {
163
+ ...doc,
164
+ authorization_endpoint: auth.toString(),
165
+ token_endpoint: token.toString(),
166
+ ...(registration ? { registration_endpoint: registration.toString() } : { registration_endpoint: undefined }),
167
+ };
168
+ }
169
+ throw new RemoteMcpOAuthError('discovery_failed', 'Could not read the authorization server\'s metadata.');
170
+ }
171
+ /**
172
+ * Full discovery from a 401 challenge.
173
+ *
174
+ * @param serverUrl - MCP server URL (secret; never in errors)
175
+ * @param challenge - Parsed `WWW-Authenticate`, if any
176
+ * @param fetchImpl - fetch
177
+ * @returns Resource, scope, issuer and endpoints
178
+ * @throws RemoteMcpOAuthError discovery_failed | pkce_unsupported
179
+ */
180
+ export async function discoverAuthorization(serverUrl, challenge, fetchImpl) {
181
+ const prm = await fetchProtectedResourceMetadata(serverUrl, challenge, fetchImpl);
182
+ const u = new URL(serverUrl);
183
+ // 2025-03-26 servers have no resource metadata: the server's origin is the AS.
184
+ const issuer = prm?.authorization_servers?.[0] ?? u.origin;
185
+ const metadata = await fetchAuthorizationServerMetadata(issuer, serverUrl, fetchImpl);
186
+ // `resource` from the metadata; otherwise the origin — never the full
187
+ // URL, whose path is the server's key on Zoho.
188
+ const resource = typeof prm?.resource === 'string' && prm.resource ? prm.resource : u.origin;
189
+ const scope = challenge?.scope
190
+ ?? (Array.isArray(prm?.scopes_supported) && prm.scopes_supported.length ? prm.scopes_supported.join(' ') : undefined);
191
+ return { resource, issuer, metadata, ...(scope ? { scope } : {}) };
192
+ }
193
+ /**
194
+ * Register Crewly as a public client (RFC 7591).
195
+ *
196
+ * @param metadata - AS metadata (must have `registration_endpoint`)
197
+ * @param redirectUri - The Cloud callback
198
+ * @param fetchImpl - fetch
199
+ * @returns The client
200
+ * @throws RemoteMcpOAuthError registration_unsupported | registration_failed
201
+ */
202
+ export async function registerClient(metadata, redirectUri, fetchImpl) {
203
+ if (!metadata.registration_endpoint) {
204
+ throw new RemoteMcpOAuthError('registration_unsupported', 'This server does not let Crewly register itself. Enter a client ID from the server\'s developer console.');
205
+ }
206
+ const methods = metadata.token_endpoint_auth_methods_supported;
207
+ const wanted = !methods || methods.includes('none') ? 'none' : methods.includes('client_secret_post') ? 'client_secret_post' : 'client_secret_basic';
208
+ let res;
209
+ try {
210
+ res = await fetchImpl(metadata.registration_endpoint, {
211
+ method: 'POST',
212
+ headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
213
+ body: JSON.stringify({
214
+ client_name: C.OAUTH_CLIENT_NAME,
215
+ redirect_uris: [redirectUri],
216
+ grant_types: ['authorization_code', 'refresh_token'],
217
+ response_types: ['code'],
218
+ token_endpoint_auth_method: wanted,
219
+ }),
220
+ signal: AbortSignal.timeout(C.OAUTH_REQUEST_TIMEOUT_MS),
221
+ });
222
+ }
223
+ catch {
224
+ throw new RemoteMcpOAuthError('network', 'Could not reach the authorization server to register Crewly.');
225
+ }
226
+ const body = (await res.text().then((t) => JSON.parse(t)).catch(() => ({})));
227
+ if (!res.ok || typeof body['client_id'] !== 'string' || !body['client_id']) {
228
+ const why = typeof body['error'] === 'string' ? ` (${String(body['error']).slice(0, 60)})` : '';
229
+ throw new RemoteMcpOAuthError('registration_failed', `The authorization server refused to register Crewly: ${res.status}${why}.`);
230
+ }
231
+ const secret = typeof body['client_secret'] === 'string' && body['client_secret'] ? body['client_secret'] : undefined;
232
+ const method = body['token_endpoint_auth_method'];
233
+ const tokenAuthMethod = method === 'client_secret_post' || method === 'client_secret_basic' || method === 'none'
234
+ ? method
235
+ : secret ? 'client_secret_post' : 'none';
236
+ return { clientId: body['client_id'], ...(secret ? { clientSecret: secret } : {}), tokenAuthMethod, redirectUri };
237
+ }
238
+ /**
239
+ * A PKCE verifier and its S256 challenge.
240
+ *
241
+ * @param random - Random source (tests)
242
+ * @returns `{ verifier, challenge }`
243
+ */
244
+ export function createPkcePair(random = randomBytes) {
245
+ const verifier = random(32).toString('base64url');
246
+ const challenge = createHash('sha256').update(verifier).digest('base64url');
247
+ return { verifier, challenge };
248
+ }
249
+ /**
250
+ * The authorize URL, without `state` (the Cloud broker adds it).
251
+ *
252
+ * @param discovered - Discovery result
253
+ * @param client - Client
254
+ * @param challenge - PKCE challenge
255
+ * @returns The URL
256
+ */
257
+ export function buildAuthorizeUrl(discovered, client, challenge) {
258
+ const u = new URL(discovered.metadata.authorization_endpoint);
259
+ u.searchParams.set('response_type', 'code');
260
+ u.searchParams.set('client_id', client.clientId);
261
+ u.searchParams.set('redirect_uri', client.redirectUri);
262
+ u.searchParams.set('code_challenge', challenge);
263
+ u.searchParams.set('code_challenge_method', 'S256');
264
+ u.searchParams.set('resource', discovered.resource);
265
+ if (discovered.scope)
266
+ u.searchParams.set('scope', discovered.scope);
267
+ // Zoho (and Google-style servers) only return a refresh token when asked.
268
+ u.searchParams.set('access_type', 'offline');
269
+ u.searchParams.set('prompt', 'consent');
270
+ return u.toString();
271
+ }
272
+ /**
273
+ * One token-endpoint call.
274
+ *
275
+ * @param tokenEndpoint - Endpoint
276
+ * @param client - Client (decides how it authenticates)
277
+ * @param form - Grant parameters
278
+ * @param fetchImpl - fetch
279
+ * @param now - Clock
280
+ * @returns Tokens
281
+ * @throws RemoteMcpOAuthError invalid_grant | token_failed | network
282
+ */
283
+ async function tokenRequest(tokenEndpoint, client, form, fetchImpl, now) {
284
+ const body = new URLSearchParams({ ...form, client_id: client.clientId });
285
+ const headers = { 'Content-Type': 'application/x-www-form-urlencoded', Accept: 'application/json' };
286
+ if (client.clientSecret && client.tokenAuthMethod === 'client_secret_basic') {
287
+ const enc = (v) => encodeURIComponent(v).replace(/%20/g, '+');
288
+ headers['Authorization'] = `Basic ${Buffer.from(`${enc(client.clientId)}:${enc(client.clientSecret)}`).toString('base64')}`;
289
+ }
290
+ else if (client.clientSecret) {
291
+ body.set('client_secret', client.clientSecret);
292
+ }
293
+ let res;
294
+ try {
295
+ res = await fetchImpl(tokenEndpoint, { method: 'POST', headers, body: body.toString(), signal: AbortSignal.timeout(C.OAUTH_REQUEST_TIMEOUT_MS) });
296
+ }
297
+ catch {
298
+ throw new RemoteMcpOAuthError('network', 'Could not reach the authorization server.');
299
+ }
300
+ const data = (await res.text().then((t) => JSON.parse(t)).catch(() => ({})));
301
+ const error = typeof data['error'] === 'string' ? data['error'] : '';
302
+ if (!res.ok || error || typeof data['access_token'] !== 'string' || !data['access_token']) {
303
+ // Zoho answers 200 with {"error":"invalid_code"} for a dead code/refresh token.
304
+ if (['invalid_grant', 'invalid_code', 'invalid_token', 'unauthorized_client'].includes(error)) {
305
+ throw new RemoteMcpOAuthError('invalid_grant', 'The sign-in is no longer valid; the owner needs to authorize again.');
306
+ }
307
+ throw new RemoteMcpOAuthError('token_failed', `The authorization server refused the token request (${res.status}${error ? `, ${error.replace(/[^A-Za-z0-9_.-]/g, '').slice(0, 40)}` : ''}).`);
308
+ }
309
+ const expiresIn = Number(data['expires_in']);
310
+ return {
311
+ accessToken: data['access_token'],
312
+ ...(typeof data['refresh_token'] === 'string' && data['refresh_token'] ? { refreshToken: data['refresh_token'] } : {}),
313
+ expiresAt: now() + (Number.isFinite(expiresIn) && expiresIn > 0 ? expiresIn * 1000 : C.OAUTH_DEFAULT_TOKEN_TTL_MS),
314
+ ...(typeof data['scope'] === 'string' ? { scope: data['scope'] } : {}),
315
+ tokenType: typeof data['token_type'] === 'string' ? data['token_type'] : 'Bearer',
316
+ };
317
+ }
318
+ /**
319
+ * Exchange an authorization code.
320
+ *
321
+ * @param args - Endpoint, client, code, verifier, resource
322
+ * @param fetchImpl - fetch
323
+ * @param now - Clock
324
+ * @returns Tokens
325
+ */
326
+ export function exchangeCode(args, fetchImpl, now = Date.now) {
327
+ return tokenRequest(args.tokenEndpoint, args.client, {
328
+ grant_type: 'authorization_code',
329
+ code: args.code,
330
+ redirect_uri: args.client.redirectUri,
331
+ code_verifier: args.verifier,
332
+ resource: args.resource,
333
+ }, fetchImpl, now);
334
+ }
335
+ /**
336
+ * Refresh an access token. A server that does not rotate refresh tokens
337
+ * returns none; the caller keeps the old one.
338
+ *
339
+ * @param args - Endpoint, client, refresh token, resource
340
+ * @param fetchImpl - fetch
341
+ * @param now - Clock
342
+ * @returns Tokens
343
+ */
344
+ export function refreshTokens(args, fetchImpl, now = Date.now) {
345
+ return tokenRequest(args.tokenEndpoint, args.client, {
346
+ grant_type: 'refresh_token',
347
+ refresh_token: args.refreshToken,
348
+ resource: args.resource,
349
+ }, fetchImpl, now);
350
+ }
351
+ //# sourceMappingURL=remote-mcp-oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-mcp-oauth.js","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp-oauth.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,9 @@ export type RemoteMcpProbeResult = {
18
18
  tools: string[];
19
19
  } | {
20
20
  ok: false;
21
- error: string;
21
+ error: string; /** The server answered 401 with a Bearer challenge: it wants OAuth. */
22
+ needsAuth?: boolean; /** Its `WWW-Authenticate` value (no secrets: metadata URL + scope). */
23
+ wwwAuthenticate?: string;
22
24
  };
23
25
  /** Minimal fetch signature (injectable for tests). */
24
26
  export type FetchLike = (url: string, init: {
@@ -1 +1 @@
1
- {"version":3,"file":"remote-mcp-probe.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp-probe.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI/D,yBAAyB;AACzB,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACrE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,sDAAsD;AACtD,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC;IAC/I,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9C,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC,CAAC;AAEH,2BAA2B;AAC3B,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAsBvG;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,SAAS,CAAC,EAAE,SAAS,GAAE,SAAyC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiE1K"}
1
+ {"version":3,"file":"remote-mcp-probe.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp-probe.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI/D,yBAAyB;AACzB,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACrE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,uEAAuE;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,uEAAuE;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhO,sDAAsD;AACtD,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC;IAC/I,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9C,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC,CAAC;AAEH,2BAA2B;AAC3B,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAsBvG;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,SAAS,CAAC,EAAE,SAAS,GAAE,SAAyC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwE1K"}
@@ -82,6 +82,7 @@ export async function probeRemoteMcp(server, fetchImpl = fetch) {
82
82
  const { url } = server;
83
83
  let sessionId = null;
84
84
  let protocolVersion = C.PROTOCOL_VERSION;
85
+ let challenge = null;
85
86
  const post = async (payload) => {
86
87
  const headers = {
87
88
  ...(server.headers ?? {}),
@@ -93,6 +94,8 @@ export async function probeRemoteMcp(server, fetchImpl = fetch) {
93
94
  if (payload.method !== 'initialize')
94
95
  headers['MCP-Protocol-Version'] = protocolVersion;
95
96
  const res = await fetchImpl(url, { method: 'POST', headers, body: JSON.stringify(payload), signal: AbortSignal.timeout(C.TEST_TIMEOUT_MS) });
97
+ if (res.status === 401)
98
+ challenge = res.headers.get('www-authenticate');
96
99
  const sid = res.headers.get('mcp-session-id');
97
100
  if (sid)
98
101
  sessionId = sid;
@@ -149,6 +152,11 @@ export async function probeRemoteMcp(server, fetchImpl = fetch) {
149
152
  ? (err.name === 'TimeoutError' || err.name === 'AbortError' ? 'The server did not answer in time.' : err.message)
150
153
  : String(err);
151
154
  const cause = err instanceof Error && err.cause instanceof Error ? ` (${err.cause.message})` : '';
155
+ // Assigned inside `post`, so TypeScript cannot see it here.
156
+ const seen = challenge;
157
+ if (seen && /\bBearer\b/i.test(seen)) {
158
+ return { ok: false, error: 'The server wants you to sign in (OAuth).', needsAuth: true, wwwAuthenticate: seen };
159
+ }
152
160
  return { ok: false, error: scrubUrl(`${raw}${cause}`, url) };
153
161
  }
154
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"remote-mcp-probe.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp-probe.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote-mcp-probe.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp-probe.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,CA6BzD"}
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,CA+BzD"}
@@ -58,6 +58,8 @@ export function getGuardedCredentialPaths() {
58
58
  // Remote MCP server URLs carry their key (Zoho MCP); runtimes read the launch files themselves.
59
59
  add('remote-mcp-servers', path.join(home, REMOTE_MCP_CONSTANTS.STORE_FILE), false);
60
60
  add('remote-mcp-launch-files', path.join(home, REMOTE_MCP_CONSTANTS.RUNTIME_DIR), true);
61
+ // Remote MCP OAuth clients + tokens (encrypted with the master key).
62
+ add('remote-mcp-oauth', path.join(home, REMOTE_MCP_CONSTANTS.OAUTH_STORE_FILE), false);
61
63
  return out;
62
64
  }
63
65
  //# 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":"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"}
1
+ {"version":3,"file":"credential-files.js","sourceRoot":"","sources":["../../../../../../backend/src/services/core/credential-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Slack file fetch — get a Slack file by link or id, even one your own bot
3
+ * cannot see.
4
+ *
5
+ * Slack serves a file only to members of a channel it was shared in. An
6
+ * agent asked to work on a colleague's file from another channel, often
7
+ * posted from another machine so the event never reached this one, had no
8
+ * way to open it. Rex asked Ella to "paste the text into the thread"
9
+ * instead (2026-10-08, `longform-en.md` in #pro-crewly-marketing).
10
+ *
11
+ * Order:
12
+ * 1. Locally, with the bot tokens this instance holds: the requesting
13
+ * agent's own bot, the uploader's bot, bots of agents in the channel,
14
+ * the workspace bot, then any other installed identity. The first one
15
+ * `files.info` answers for downloads the file.
16
+ * 2. Otherwise Crewly Cloud (`POST /api/cloud/slack/files/fetch`), which
17
+ * holds every bot of the account and tries them the same way.
18
+ *
19
+ * Files land in the same directory as inbound Slack attachments
20
+ * (`~/.crewly/tmp/slack-files/<id>-<name>`).
21
+ *
22
+ * @module services/slack/slack-file-fetch
23
+ */
24
+ import { type SlackFileRef } from './slack-file-ref.js';
25
+ /** Stable failure codes (the route maps them to HTTP statuses). */
26
+ export type SlackFileGetErrorCode = 'validation' | 'not_visible' | 'no_file_in_message' | 'file_deleted' | 'too_large' | 'foreign_workspace' | 'cloud_unavailable' | 'slack_error';
27
+ /** HTTP status per code. */
28
+ export declare const SLACK_FILE_GET_STATUS: Record<SlackFileGetErrorCode, number>;
29
+ /** A failure with a stable code. */
30
+ export declare class SlackFileGetError extends Error {
31
+ readonly code: SlackFileGetErrorCode;
32
+ constructor(code: SlackFileGetErrorCode, message: string);
33
+ }
34
+ /** What the caller learns about a fetched file. */
35
+ export interface SlackFetchedFileMeta {
36
+ id: string;
37
+ name: string;
38
+ mimetype: string;
39
+ size: number;
40
+ user: string | null;
41
+ channels: string[];
42
+ permalink: string | null;
43
+ isText: boolean;
44
+ /** Who could see it: `local:<session>`, `local:workspace`, or `cloud:<bot>`. */
45
+ via: string;
46
+ /** Other files on the same message (message links). */
47
+ otherFileIds?: string[];
48
+ }
49
+ /** A fetched file, saved on disk. */
50
+ export interface SlackFetchedFile {
51
+ meta: SlackFetchedFileMeta;
52
+ localPath: string;
53
+ }
54
+ /** One bot token this instance may try. */
55
+ export interface LocalTokenCandidate {
56
+ token: string;
57
+ /** For logs and the result: `<session>` or `workspace`. */
58
+ label: string;
59
+ }
60
+ /** Collaborators (injectable for tests). */
61
+ export interface SlackFileFetchDeps {
62
+ /** Local bot tokens in the order to try them. */
63
+ localCandidates: (ref: SlackFileRef, requesterAgent?: string) => LocalTokenCandidate[] | Promise<LocalTokenCandidate[]>;
64
+ /** Cloud base URL and access token; null when not signed in. */
65
+ cloud: () => {
66
+ baseUrl: string;
67
+ token: string;
68
+ } | null;
69
+ /** Where files are written. Default `~/.crewly/tmp/slack-files`. */
70
+ saveDir?: string;
71
+ fetchImpl?: typeof fetch;
72
+ slackApiBase?: string;
73
+ }
74
+ /**
75
+ * The service — see module docs.
76
+ */
77
+ export declare class SlackFileFetchService {
78
+ private readonly deps;
79
+ private readonly logger;
80
+ private readonly fetchImpl;
81
+ private readonly apiBase;
82
+ private readonly saveDir;
83
+ constructor(deps: SlackFileFetchDeps);
84
+ /**
85
+ * Fetch a file: locally first, then through Cloud.
86
+ *
87
+ * @param fileRef - File id, permalink, download URL or message link
88
+ * @param opts - `requesterAgent` (preferred bot, audit), `maxBytes` (default 25 MB)
89
+ * @returns Metadata and the saved path
90
+ * @throws {SlackFileGetError}
91
+ */
92
+ get(fileRef: string, opts?: {
93
+ requesterAgent?: string;
94
+ maxBytes?: number;
95
+ }): Promise<SlackFetchedFile>;
96
+ private getLocal;
97
+ private fileFromMessage;
98
+ private download;
99
+ private getViaCloud;
100
+ private save;
101
+ private slack;
102
+ }
103
+ /**
104
+ * The first lines of a text file, for a one-glance preview.
105
+ *
106
+ * @param localPath - Saved file
107
+ * @returns Up to PREVIEW_LINES lines / PREVIEW_CHARS characters
108
+ */
109
+ export declare function previewTextFile(localPath: string): Promise<string>;
110
+ /**
111
+ * The process-wide service, wired to this instance's Slack identities and
112
+ * Cloud sign-in. Built on first use.
113
+ *
114
+ * @returns The service
115
+ */
116
+ export declare function getSlackFileFetchService(): Promise<SlackFileFetchService>;
117
+ /** Replace the process-wide service (tests). */
118
+ export declare function setSlackFileFetchService(service: SlackFileFetchService | null): void;
119
+ //# sourceMappingURL=slack-file-fetch.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-file-fetch.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-file-fetch.service.ts"],"names":[],"mappings":"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"}