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
@@ -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
- * Claude Code's `--mcp-config` body.
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
- * @returns `{ mcpServers: { <id>: { type: 'http', url, headers? } } }`
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?: Record<string, string>;
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;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,EAAE,gBAAgB,EAAmB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAIlG,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;CAC5B;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;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE,CAMhK;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
+ {"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
- * Claude Code's `--mcp-config` body.
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
- * @returns `{ mcpServers: { <id>: { type: 'http', url, headers? } } }`
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: s.url, ...(s.headers && Object.keys(s.headers).length ? { headers: s.headers } : {}) };
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.url));
142
+ await writeSecretText(urlFile, JSON.stringify(remoteMcpProxyUrl(apiBaseUrl, s.id)));
113
143
  flags.push('-c', `"mcp_servers.${s.id}.url=$(cat ${shq(urlFile)})"`);
114
- if (s.headers && Object.keys(s.headers).length > 0) {
115
- const headersFile = path.join(dir, `codex-${s.id}-headers.toml`);
116
- await writeSecretText(headersFile, toTomlInlineTable(s.headers));
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":"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"}
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,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":"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,oBAAoB,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5K,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAYnE;;;;;;GAMG;AACH,SAAS,aAAa;IACrB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB;IACxC,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,CAAS,EAAE,WAAoB,EAAQ,EAAE;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,GAAG,CAAC,WAAW,EAAE,mBAAmB,EAAE,EAAE,KAAK,CAAC,CAAC;IAC/C,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IACpD,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC,CAAC;IACvF,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC;IAClE,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,8BAA8B,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;IACrG,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,qBAAqB,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/F,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/F,KAAK,MAAM,QAAQ,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,GAAG,QAAQ,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,mBAAmB,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9F,CAAC;IACD,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9D,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5E,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACrF,gGAAgG;IAChG,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IACnF,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IACxF,OAAO,GAAG,CAAC;AACZ,CAAC"}
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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"}