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.
- package/config/skills/_common/lib.sh +15 -2
- package/config/skills/agent/core/app-data/SKILL.md +13 -1
- package/config/skills/agent/core/app-data/execute.sh +41 -5
- package/config/skills/agent/core/app-data/execute.test.sh +47 -1
- package/config/skills/agent/core/publish-app/SKILL.md +1 -1
- package/config/skills/agent/core/slack-file/SKILL.md +53 -0
- package/config/skills/agent/core/slack-file/execute.sh +72 -0
- package/config/skills/agent/core/slack-file/execute.test.sh +34 -0
- package/dist/backend/backend/src/constants.d.ts +59 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +59 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts +7 -0
- package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/apps/apps.controller.js +23 -0
- package/dist/backend/backend/src/controllers/apps/apps.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts +9 -0
- package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/apps/apps.routes.js +19 -1
- package/dist/backend/backend/src/controllers/apps/apps.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/connector.routes.js +6 -1
- package/dist/backend/backend/src/controllers/connector/connector.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts +69 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js +203 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts +16 -0
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js +126 -5
- package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +37 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +5 -0
- package/dist/backend/backend/src/index.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 +2 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/apps/apps-cloud.client.d.ts +2 -0
- package/dist/backend/backend/src/services/apps/apps-cloud.client.d.ts.map +1 -1
- package/dist/backend/backend/src/services/apps/apps-cloud.client.js +1 -0
- package/dist/backend/backend/src/services/apps/apps-cloud.client.js.map +1 -1
- package/dist/backend/backend/src/services/apps/apps.service.d.ts +17 -0
- package/dist/backend/backend/src/services/apps/apps.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/apps/apps.service.js +24 -0
- package/dist/backend/backend/src/services/apps/apps.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +4 -3
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.d.ts +43 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.d.ts.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.js +98 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.js.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.d.ts +277 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.js +719 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.js.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts +29 -5
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js +40 -12
- package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-oauth.d.ts +196 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-oauth.d.ts.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-oauth.js +351 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-oauth.js.map +1 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts +3 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js +8 -0
- package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/credential-files.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/credential-files.js +2 -0
- package/dist/backend/backend/src/services/core/credential-files.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-file-fetch.service.d.ts +119 -0
- package/dist/backend/backend/src/services/slack/slack-file-fetch.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-file-fetch.service.js +415 -0
- package/dist/backend/backend/src/services/slack/slack-file-fetch.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-file-ref.d.ts +69 -0
- package/dist/backend/backend/src/services/slack/slack-file-ref.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-file-ref.js +177 -0
- package/dist/backend/backend/src/services/slack/slack-file-ref.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +16 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +15 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +84 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +11 -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 +59 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +59 -0
- package/dist/cli/backend/src/constants.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 +2 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts +29 -5
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js +40 -12
- package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/credential-files.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/credential-files.js +2 -0
- package/dist/cli/backend/src/services/core/credential-files.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-file-fetch.service.d.ts +119 -0
- package/dist/cli/backend/src/services/slack/slack-file-fetch.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-file-fetch.service.js +415 -0
- package/dist/cli/backend/src/services/slack/slack-file-fetch.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-file-ref.d.ts +69 -0
- package/dist/cli/backend/src/services/slack/slack-file-ref.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-file-ref.js +177 -0
- package/dist/cli/backend/src/services/slack/slack-file-ref.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +15 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +84 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +11 -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-83188f0b.js → index-7e5ebf78.js} +111 -111
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hand remote MCP servers to an agent at launch.
|
|
3
3
|
*
|
|
4
|
-
* For each server whose `mcp:<id>` allowlist admits the agent's role
|
|
4
|
+
* For each server whose `mcp:<id>` allowlist admits the agent's role, the
|
|
5
|
+
* agent gets the backend's proxy (`<api>/api/connectors/remote-mcp/<id>/mcp`,
|
|
6
|
+
* see remote-mcp-proxy.controller) rather than the server itself: the
|
|
7
|
+
* server URL (Zoho's carries its key) and OAuth tokens never reach an agent
|
|
8
|
+
* config. The only credential in the files is the agent's own identity
|
|
9
|
+
* (`X-Agent-Session` + badge), which the proxy checks against the allowlist.
|
|
5
10
|
*
|
|
6
11
|
* | Runtime | How |
|
|
7
12
|
* |---|---|
|
|
@@ -27,6 +32,8 @@ export interface RemoteMcpLaunchInput {
|
|
|
27
32
|
crewlyHome?: string;
|
|
28
33
|
/** Override the store (tests). */
|
|
29
34
|
service?: RemoteMcpService;
|
|
35
|
+
/** Override the backend base URL (tests). */
|
|
36
|
+
apiBaseUrl?: string;
|
|
30
37
|
}
|
|
31
38
|
/** What {@link buildRemoteMcpLaunchFlags} decided. */
|
|
32
39
|
export interface RemoteMcpLaunchResult {
|
|
@@ -46,16 +53,33 @@ export interface RemoteMcpLaunchResult {
|
|
|
46
53
|
*/
|
|
47
54
|
export declare function remoteMcpSessionDir(crewlyHome: string, sessionName: string): string;
|
|
48
55
|
/**
|
|
49
|
-
*
|
|
56
|
+
* The proxy URL an agent uses for a server.
|
|
57
|
+
*
|
|
58
|
+
* @param apiBaseUrl - Backend base, e.g. `http://localhost:8787`
|
|
59
|
+
* @param id - Server id
|
|
60
|
+
* @returns `<base>/api/connectors/remote-mcp/<id>/mcp`
|
|
61
|
+
*/
|
|
62
|
+
export declare function remoteMcpProxyUrl(apiBaseUrl: string, id: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* Headers that identify the agent to the proxy.
|
|
65
|
+
*
|
|
66
|
+
* @param sessionName - Agent session
|
|
67
|
+
* @returns `X-Agent-Session` and `X-Agent-Badge`
|
|
68
|
+
*/
|
|
69
|
+
export declare function proxyIdentityHeaders(sessionName: string): Record<string, string>;
|
|
70
|
+
/**
|
|
71
|
+
* Claude Code's `--mcp-config` body: every server through the proxy.
|
|
50
72
|
*
|
|
51
73
|
* @param servers - Allowed servers
|
|
52
|
-
* @
|
|
74
|
+
* @param sessionName - Agent session (identity headers)
|
|
75
|
+
* @param apiBaseUrl - Backend base URL
|
|
76
|
+
* @returns `{ mcpServers: { <id>: { type: 'http', url: <proxy>, headers } } }`
|
|
53
77
|
*/
|
|
54
|
-
export declare function buildClaudeMcpConfig(servers: RemoteMcpServer[]): {
|
|
78
|
+
export declare function buildClaudeMcpConfig(servers: RemoteMcpServer[], sessionName: string, apiBaseUrl: string): {
|
|
55
79
|
mcpServers: Record<string, {
|
|
56
80
|
type: 'http';
|
|
57
81
|
url: string;
|
|
58
|
-
headers
|
|
82
|
+
headers: Record<string, string>;
|
|
59
83
|
}>;
|
|
60
84
|
};
|
|
61
85
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-mcp-launch.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp-launch.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"remote-mcp-launch.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp-launch.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,EAAE,gBAAgB,EAAmB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAMlG,mDAAmD;AACnD,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,sDAAsD;AACtD,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,sCAAsC;IACtC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,YAAY,GAAG,qBAAqB,GAAG,OAAO,CAAC;CAC1D;AAYD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAGnF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEhF;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE,CAMxM;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAGzE;AAaD;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgD3G"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hand remote MCP servers to an agent at launch.
|
|
3
3
|
*
|
|
4
|
-
* For each server whose `mcp:<id>` allowlist admits the agent's role
|
|
4
|
+
* For each server whose `mcp:<id>` allowlist admits the agent's role, the
|
|
5
|
+
* agent gets the backend's proxy (`<api>/api/connectors/remote-mcp/<id>/mcp`,
|
|
6
|
+
* see remote-mcp-proxy.controller) rather than the server itself: the
|
|
7
|
+
* server URL (Zoho's carries its key) and OAuth tokens never reach an agent
|
|
8
|
+
* config. The only credential in the files is the agent's own identity
|
|
9
|
+
* (`X-Agent-Session` + badge), which the proxy checks against the allowlist.
|
|
5
10
|
*
|
|
6
11
|
* | Runtime | How |
|
|
7
12
|
* |---|---|
|
|
@@ -20,6 +25,8 @@ import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
|
20
25
|
import { LoggerService } from '../core/logger.service.js';
|
|
21
26
|
import { REMOTE_MCP_CONSTANTS, RUNTIME_TYPES } from '../../constants.js';
|
|
22
27
|
import { RemoteMcpService, writeSecretJson } from './remote-mcp.service.js';
|
|
28
|
+
import { getLocalApiBaseUrl } from '../../utils/local-api-url.utils.js';
|
|
29
|
+
import { mintAgentBadge } from '../core/owner-auth.service.js';
|
|
23
30
|
const C = REMOTE_MCP_CONSTANTS;
|
|
24
31
|
/**
|
|
25
32
|
* Quote for a POSIX shell.
|
|
@@ -42,15 +49,36 @@ export function remoteMcpSessionDir(crewlyHome, sessionName) {
|
|
|
42
49
|
return path.join(crewlyHome, C.RUNTIME_DIR, safe);
|
|
43
50
|
}
|
|
44
51
|
/**
|
|
45
|
-
*
|
|
52
|
+
* The proxy URL an agent uses for a server.
|
|
53
|
+
*
|
|
54
|
+
* @param apiBaseUrl - Backend base, e.g. `http://localhost:8787`
|
|
55
|
+
* @param id - Server id
|
|
56
|
+
* @returns `<base>/api/connectors/remote-mcp/<id>/mcp`
|
|
57
|
+
*/
|
|
58
|
+
export function remoteMcpProxyUrl(apiBaseUrl, id) {
|
|
59
|
+
return `${apiBaseUrl.replace(/\/$/, '')}/api/connectors/remote-mcp/${encodeURIComponent(id)}${C.PROXY_SUFFIX}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Headers that identify the agent to the proxy.
|
|
63
|
+
*
|
|
64
|
+
* @param sessionName - Agent session
|
|
65
|
+
* @returns `X-Agent-Session` and `X-Agent-Badge`
|
|
66
|
+
*/
|
|
67
|
+
export function proxyIdentityHeaders(sessionName) {
|
|
68
|
+
return { 'X-Agent-Session': sessionName, 'X-Agent-Badge': mintAgentBadge(sessionName) };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Claude Code's `--mcp-config` body: every server through the proxy.
|
|
46
72
|
*
|
|
47
73
|
* @param servers - Allowed servers
|
|
48
|
-
* @
|
|
74
|
+
* @param sessionName - Agent session (identity headers)
|
|
75
|
+
* @param apiBaseUrl - Backend base URL
|
|
76
|
+
* @returns `{ mcpServers: { <id>: { type: 'http', url: <proxy>, headers } } }`
|
|
49
77
|
*/
|
|
50
|
-
export function buildClaudeMcpConfig(servers) {
|
|
78
|
+
export function buildClaudeMcpConfig(servers, sessionName, apiBaseUrl) {
|
|
51
79
|
const mcpServers = {};
|
|
52
80
|
for (const s of servers) {
|
|
53
|
-
mcpServers[s.id] = { type: 'http', url:
|
|
81
|
+
mcpServers[s.id] = { type: 'http', url: remoteMcpProxyUrl(apiBaseUrl, s.id), headers: proxyIdentityHeaders(sessionName) };
|
|
54
82
|
}
|
|
55
83
|
return { mcpServers };
|
|
56
84
|
}
|
|
@@ -86,6 +114,7 @@ export async function buildRemoteMcpLaunchFlags(input) {
|
|
|
86
114
|
const logger = LoggerService.getInstance().createComponentLogger('RemoteMcpLaunch');
|
|
87
115
|
const { sessionName, role, runtimeType } = input;
|
|
88
116
|
const crewlyHome = input.crewlyHome || getCrewlyHomePath();
|
|
117
|
+
const apiBaseUrl = input.apiBaseUrl || getLocalApiBaseUrl();
|
|
89
118
|
const dir = remoteMcpSessionDir(crewlyHome, sessionName);
|
|
90
119
|
try {
|
|
91
120
|
const servers = await (input.service ?? RemoteMcpService.getInstance()).serversForRole(role);
|
|
@@ -102,20 +131,19 @@ export async function buildRemoteMcpLaunchFlags(input) {
|
|
|
102
131
|
await fs.chmod(dir, 0o700);
|
|
103
132
|
if (runtimeType === RUNTIME_TYPES.CLAUDE_CODE) {
|
|
104
133
|
const file = path.join(dir, C.CLAUDE_CONFIG_FILE);
|
|
105
|
-
await writeSecretJson(file, buildClaudeMcpConfig(servers));
|
|
134
|
+
await writeSecretJson(file, buildClaudeMcpConfig(servers, sessionName, apiBaseUrl));
|
|
106
135
|
logger.info('Remote MCP servers: added via --mcp-config', { sessionName, role, servers: ids });
|
|
107
136
|
return { flags: ['--mcp-config', shq(file)], servers: ids };
|
|
108
137
|
}
|
|
109
138
|
const flags = [];
|
|
139
|
+
const headersToml = toTomlInlineTable(proxyIdentityHeaders(sessionName));
|
|
110
140
|
for (const s of servers) {
|
|
111
141
|
const urlFile = path.join(dir, `codex-${s.id}-url.toml`);
|
|
112
|
-
await writeSecretText(urlFile, JSON.stringify(s.
|
|
142
|
+
await writeSecretText(urlFile, JSON.stringify(remoteMcpProxyUrl(apiBaseUrl, s.id)));
|
|
113
143
|
flags.push('-c', `"mcp_servers.${s.id}.url=$(cat ${shq(urlFile)})"`);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
flags.push('-c', `"mcp_servers.${s.id}.http_headers=$(cat ${shq(headersFile)})"`);
|
|
118
|
-
}
|
|
144
|
+
const headersFile = path.join(dir, `codex-${s.id}-headers.toml`);
|
|
145
|
+
await writeSecretText(headersFile, headersToml);
|
|
146
|
+
flags.push('-c', `"mcp_servers.${s.id}.http_headers=$(cat ${shq(headersFile)})"`);
|
|
119
147
|
}
|
|
120
148
|
logger.info('Remote MCP servers: added via codex -c mcp_servers', { sessionName, role, servers: ids });
|
|
121
149
|
return { flags, servers: ids };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-mcp-launch.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp-launch.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"remote-mcp-launch.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/connector/remote-mcp-launch.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,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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"}
|