crewly 1.20.264 → 1.20.266

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 (144) hide show
  1. package/config/skills/agent/core/docs-comment/SKILL.md +6 -3
  2. package/config/skills/agent/core/docs-comment/execute.sh +1 -1
  3. package/config/skills/agent/core/gmail-send/SKILL.md +4 -0
  4. package/config/skills/agent/core/gmail-send/execute.sh +1 -1
  5. package/config/skills/agent/core/gmail-send/execute.test.sh +11 -0
  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 +77 -0
  10. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  11. package/dist/backend/backend/src/constants.js +77 -0
  12. package/dist/backend/backend/src/constants.js.map +1 -1
  13. package/dist/backend/backend/src/controllers/connector/connector.routes.d.ts.map +1 -1
  14. package/dist/backend/backend/src/controllers/connector/connector.routes.js +6 -1
  15. package/dist/backend/backend/src/controllers/connector/connector.routes.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts +69 -0
  17. package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.d.ts.map +1 -0
  18. package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js +203 -0
  19. package/dist/backend/backend/src/controllers/connector/remote-mcp-proxy.controller.js.map +1 -0
  20. package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts +16 -0
  21. package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.d.ts.map +1 -1
  22. package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js +126 -5
  23. package/dist/backend/backend/src/controllers/connector/remote-mcp.controller.js.map +1 -1
  24. package/dist/backend/backend/src/controllers/google/google-connect-card.d.ts +12 -1
  25. package/dist/backend/backend/src/controllers/google/google-connect-card.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/google/google-connect-card.js +28 -10
  27. package/dist/backend/backend/src/controllers/google/google-connect-card.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/google/google.controller.d.ts +26 -2
  29. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/google/google.controller.js +123 -33
  31. package/dist/backend/backend/src/controllers/google/google.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 +15 -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/cloud/mobile-api-relay.service.d.ts.map +1 -1
  42. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +4 -3
  43. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  44. package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.d.ts +43 -0
  45. package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.d.ts.map +1 -0
  46. package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.js +98 -0
  47. package/dist/backend/backend/src/services/connector/remote-mcp-auth-card.js.map +1 -0
  48. package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.d.ts +277 -0
  49. package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.d.ts.map +1 -0
  50. package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.js +719 -0
  51. package/dist/backend/backend/src/services/connector/remote-mcp-auth.service.js.map +1 -0
  52. package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts +29 -5
  53. package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -1
  54. package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js +40 -12
  55. package/dist/backend/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -1
  56. package/dist/backend/backend/src/services/connector/remote-mcp-oauth.d.ts +196 -0
  57. package/dist/backend/backend/src/services/connector/remote-mcp-oauth.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/connector/remote-mcp-oauth.js +351 -0
  59. package/dist/backend/backend/src/services/connector/remote-mcp-oauth.js.map +1 -0
  60. package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts +3 -1
  61. package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.d.ts.map +1 -1
  62. package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js +8 -0
  63. package/dist/backend/backend/src/services/connector/remote-mcp-probe.service.js.map +1 -1
  64. package/dist/backend/backend/src/services/core/credential-files.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/core/credential-files.js +2 -0
  66. package/dist/backend/backend/src/services/core/credential-files.js.map +1 -1
  67. package/dist/backend/backend/src/services/google/docs-comments.service.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/google/docs-comments.service.js +4 -1
  69. package/dist/backend/backend/src/services/google/docs-comments.service.js.map +1 -1
  70. package/dist/backend/backend/src/services/google/google-api.client.d.ts +16 -0
  71. package/dist/backend/backend/src/services/google/google-api.client.d.ts.map +1 -1
  72. package/dist/backend/backend/src/services/google/google-api.client.js +44 -0
  73. package/dist/backend/backend/src/services/google/google-api.client.js.map +1 -1
  74. package/dist/backend/backend/src/services/google/google-reauth-notifier.service.d.ts +159 -0
  75. package/dist/backend/backend/src/services/google/google-reauth-notifier.service.d.ts.map +1 -0
  76. package/dist/backend/backend/src/services/google/google-reauth-notifier.service.js +283 -0
  77. package/dist/backend/backend/src/services/google/google-reauth-notifier.service.js.map +1 -0
  78. package/dist/backend/backend/src/services/google/google-reauth.wiring.d.ts +71 -0
  79. package/dist/backend/backend/src/services/google/google-reauth.wiring.d.ts.map +1 -0
  80. package/dist/backend/backend/src/services/google/google-reauth.wiring.js +132 -0
  81. package/dist/backend/backend/src/services/google/google-reauth.wiring.js.map +1 -0
  82. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +28 -10
  83. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/google/google-workspace-token.service.js +24 -11
  85. package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
  86. package/dist/backend/backend/src/services/slack/slack-file-fetch.service.d.ts +119 -0
  87. package/dist/backend/backend/src/services/slack/slack-file-fetch.service.d.ts.map +1 -0
  88. package/dist/backend/backend/src/services/slack/slack-file-fetch.service.js +415 -0
  89. package/dist/backend/backend/src/services/slack/slack-file-fetch.service.js.map +1 -0
  90. package/dist/backend/backend/src/services/slack/slack-file-ref.d.ts +69 -0
  91. package/dist/backend/backend/src/services/slack/slack-file-ref.d.ts.map +1 -0
  92. package/dist/backend/backend/src/services/slack/slack-file-ref.js +177 -0
  93. package/dist/backend/backend/src/services/slack/slack-file-ref.js.map +1 -0
  94. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  95. package/dist/backend/backend/src/services/slack/slack-initializer.js +16 -0
  96. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  97. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +15 -0
  98. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  99. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +84 -1
  100. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  101. package/dist/backend/backend/src/services/slack/slack.service.d.ts +2 -1
  102. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  103. package/dist/backend/backend/src/services/slack/slack.service.js +3 -1
  104. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  105. package/dist/backend/backend/src/types/slack.types.d.ts +11 -0
  106. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  107. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  108. package/dist/backend/build-info.json +2 -2
  109. package/dist/cli/backend/src/constants.d.ts +77 -0
  110. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  111. package/dist/cli/backend/src/constants.js +77 -0
  112. package/dist/cli/backend/src/constants.js.map +1 -1
  113. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  114. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
  115. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  116. package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts +29 -5
  117. package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.d.ts.map +1 -1
  118. package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js +40 -12
  119. package/dist/cli/backend/src/services/connector/remote-mcp-launch.service.js.map +1 -1
  120. package/dist/cli/backend/src/services/core/credential-files.d.ts.map +1 -1
  121. package/dist/cli/backend/src/services/core/credential-files.js +2 -0
  122. package/dist/cli/backend/src/services/core/credential-files.js.map +1 -1
  123. package/dist/cli/backend/src/services/slack/slack-file-fetch.service.d.ts +119 -0
  124. package/dist/cli/backend/src/services/slack/slack-file-fetch.service.d.ts.map +1 -0
  125. package/dist/cli/backend/src/services/slack/slack-file-fetch.service.js +415 -0
  126. package/dist/cli/backend/src/services/slack/slack-file-fetch.service.js.map +1 -0
  127. package/dist/cli/backend/src/services/slack/slack-file-ref.d.ts +69 -0
  128. package/dist/cli/backend/src/services/slack/slack-file-ref.d.ts.map +1 -0
  129. package/dist/cli/backend/src/services/slack/slack-file-ref.js +177 -0
  130. package/dist/cli/backend/src/services/slack/slack-file-ref.js.map +1 -0
  131. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +15 -0
  132. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  133. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +84 -1
  134. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  135. package/dist/cli/backend/src/services/slack/slack.service.d.ts +2 -1
  136. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  137. package/dist/cli/backend/src/services/slack/slack.service.js +3 -1
  138. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  139. package/dist/cli/backend/src/types/slack.types.d.ts +11 -0
  140. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  141. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  142. package/frontend/dist/assets/{index-83188f0b.js → index-7e5ebf78.js} +111 -111
  143. package/frontend/dist/index.html +1 -1
  144. package/package.json +1 -1
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Agent → remote MCP proxy: `/api/connectors/remote-mcp/:id/mcp`.
3
+ *
4
+ * Agents' MCP configs point here instead of at the server, so the server's
5
+ * URL (Zoho's carries its key) and OAuth tokens never sit in an agent's
6
+ * config. Each request:
7
+ *
8
+ * 1. must come from an agent (its badge or session header — the owner and
9
+ * anonymous callers are refused with 403, never 401: a 401 would make
10
+ * Claude Code start its own localhost OAuth flow against us);
11
+ * 2. passes the server's `mcp:<id>` role allowlist;
12
+ * 3. is forwarded with the server's static headers plus a fresh
13
+ * `Authorization: Bearer` for OAuth servers — streamable HTTP as is:
14
+ * JSON or `text/event-stream` responses stream through, `Mcp-Session-Id`,
15
+ * `MCP-Protocol-Version` and `Last-Event-ID` pass both ways;
16
+ * 4. on an upstream 401 the token is refreshed once and the request
17
+ * retried; when that fails the owner gets a sign-in card (throttled) and
18
+ * the agent gets a JSON-RPC error saying so.
19
+ *
20
+ * Nothing about the URL, token or body is logged.
21
+ *
22
+ * @module controllers/connector/remote-mcp-proxy.controller
23
+ */
24
+ import type { Request, Response } from 'express';
25
+ import { ConnectorAccessService } from '../../services/connector/connector-access.service.js';
26
+ import { RemoteMcpService } from '../../services/connector/remote-mcp.service.js';
27
+ import { RemoteMcpAuthService } from '../../services/connector/remote-mcp-auth.service.js';
28
+ /** Upstream response shape the proxy needs (fetch's Response). */
29
+ export interface UpstreamResponse {
30
+ status: number;
31
+ headers: {
32
+ get(name: string): string | null;
33
+ };
34
+ body: ReadableStream<Uint8Array> | null;
35
+ text(): Promise<string>;
36
+ }
37
+ /** Collaborators (tests inject). */
38
+ export interface ProxyDeps {
39
+ servers: () => Pick<RemoteMcpService, 'get'>;
40
+ auth: () => Pick<RemoteMcpAuthService, 'usesOAuth' | 'getAccessToken' | 'onUnauthorized' | 'view'>;
41
+ access: () => Pick<ConnectorAccessService, 'isAllowed' | 'allowedRoles'>;
42
+ fetchImpl: (url: string, init: {
43
+ method: string;
44
+ headers: Record<string, string>;
45
+ body?: string;
46
+ signal: AbortSignal;
47
+ }) => Promise<UpstreamResponse>;
48
+ }
49
+ /**
50
+ * Replace collaborators (tests).
51
+ *
52
+ * @param next - Partial overrides
53
+ */
54
+ export declare function setRemoteMcpProxyDeps(next: Partial<ProxyDeps>): void;
55
+ /**
56
+ * The JSON-RPC id of a request body, if it is a request (not a notification).
57
+ *
58
+ * @param body - Raw body
59
+ * @returns The id, or undefined
60
+ */
61
+ export declare function rpcIdOf(body: string | undefined): string | number | null | undefined;
62
+ /**
63
+ * ALL /api/connectors/remote-mcp/:id/mcp
64
+ *
65
+ * @param req - Agent request (JSON-RPC over streamable HTTP)
66
+ * @param res - The server's answer, streamed
67
+ */
68
+ export declare function proxyRemoteMcp(req: Request, res: Response): Promise<void>;
69
+ //# sourceMappingURL=remote-mcp-proxy.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-mcp-proxy.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp-proxy.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAA8C,MAAM,gDAAgD,CAAC;AAC9H,OAAO,EAAE,oBAAoB,EAAE,MAAM,qDAAqD,CAAC;AAW3F,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9C,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACxC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,oCAAoC;AACpC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,EAAE,MAAM,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,MAAM,CAAC,CAAC;IACnG,MAAM,EAAE,MAAM,IAAI,CAAC,sBAAsB,EAAE,WAAW,GAAG,cAAc,CAAC,CAAC;IACzE,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACtJ;AASD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CASpF;AAmBD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkH/E"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Agent → remote MCP proxy: `/api/connectors/remote-mcp/:id/mcp`.
3
+ *
4
+ * Agents' MCP configs point here instead of at the server, so the server's
5
+ * URL (Zoho's carries its key) and OAuth tokens never sit in an agent's
6
+ * config. Each request:
7
+ *
8
+ * 1. must come from an agent (its badge or session header — the owner and
9
+ * anonymous callers are refused with 403, never 401: a 401 would make
10
+ * Claude Code start its own localhost OAuth flow against us);
11
+ * 2. passes the server's `mcp:<id>` role allowlist;
12
+ * 3. is forwarded with the server's static headers plus a fresh
13
+ * `Authorization: Bearer` for OAuth servers — streamable HTTP as is:
14
+ * JSON or `text/event-stream` responses stream through, `Mcp-Session-Id`,
15
+ * `MCP-Protocol-Version` and `Last-Event-ID` pass both ways;
16
+ * 4. on an upstream 401 the token is refreshed once and the request
17
+ * retried; when that fails the owner gets a sign-in card (throttled) and
18
+ * the agent gets a JSON-RPC error saying so.
19
+ *
20
+ * Nothing about the URL, token or body is logged.
21
+ *
22
+ * @module controllers/connector/remote-mcp-proxy.controller
23
+ */
24
+ import { Readable } from 'stream';
25
+ import { LoggerService } from '../../services/core/logger.service.js';
26
+ import { getCallerIdentity } from '../../middleware/caller-identity.middleware.js';
27
+ import { resolveAgentCaller } from '../../utils/agent-caller.utils.js';
28
+ import { ConnectorAccessService } from '../../services/connector/connector-access.service.js';
29
+ import { RemoteMcpService, remoteMcpConnectorId } from '../../services/connector/remote-mcp.service.js';
30
+ import { RemoteMcpAuthService } from '../../services/connector/remote-mcp-auth.service.js';
31
+ import { REMOTE_MCP_CONSTANTS } from '../../constants.js';
32
+ const logger = LoggerService.getInstance().createComponentLogger('RemoteMcpProxy');
33
+ const C = REMOTE_MCP_CONSTANTS;
34
+ /** Request headers passed upstream. */
35
+ const FORWARD_REQUEST = ['content-type', 'accept', 'mcp-session-id', 'mcp-protocol-version', 'last-event-id'];
36
+ /** Response headers passed back. */
37
+ const FORWARD_RESPONSE = ['content-type', 'mcp-session-id', 'mcp-protocol-version', 'cache-control'];
38
+ let deps = {
39
+ servers: () => RemoteMcpService.getInstance(),
40
+ auth: () => RemoteMcpAuthService.getInstance(),
41
+ access: () => ConnectorAccessService.getInstance(),
42
+ fetchImpl: (url, init) => fetch(url, init),
43
+ };
44
+ /**
45
+ * Replace collaborators (tests).
46
+ *
47
+ * @param next - Partial overrides
48
+ */
49
+ export function setRemoteMcpProxyDeps(next) {
50
+ deps = { ...deps, ...next };
51
+ }
52
+ /**
53
+ * The JSON-RPC id of a request body, if it is a request (not a notification).
54
+ *
55
+ * @param body - Raw body
56
+ * @returns The id, or undefined
57
+ */
58
+ export function rpcIdOf(body) {
59
+ if (!body)
60
+ return undefined;
61
+ try {
62
+ const parsed = JSON.parse(body);
63
+ const first = Array.isArray(parsed) ? parsed[0] : parsed;
64
+ return first && 'id' in first ? first.id : undefined;
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ /**
71
+ * Answer the agent without reaching the server.
72
+ *
73
+ * @param res - Response
74
+ * @param body - Raw request body (decides JSON-RPC error vs plain)
75
+ * @param message - What the agent should know
76
+ * @param httpStatus - Status when it is not a JSON-RPC request
77
+ */
78
+ function refuse(res, body, message, httpStatus, rpcCode = -32000) {
79
+ const id = rpcIdOf(body);
80
+ if (id !== undefined) {
81
+ res.status(200).json({ jsonrpc: '2.0', id, error: { code: rpcCode, message } });
82
+ return;
83
+ }
84
+ res.status(httpStatus).json({ success: false, error: message });
85
+ }
86
+ /**
87
+ * ALL /api/connectors/remote-mcp/:id/mcp
88
+ *
89
+ * @param req - Agent request (JSON-RPC over streamable HTTP)
90
+ * @param res - The server's answer, streamed
91
+ */
92
+ export async function proxyRemoteMcp(req, res) {
93
+ const id = String(req.params.id ?? '');
94
+ const raw = req.rawBody;
95
+ const body = req.method === 'POST' ? (raw ?? (req.body && Object.keys(req.body).length ? JSON.stringify(req.body) : undefined)) : undefined;
96
+ const identity = getCallerIdentity(req);
97
+ if (identity.kind !== 'agent') {
98
+ res.status(403).json({ success: false, error: 'agents_only', message: 'This endpoint is for Crewly agents. The owner manages servers in Connections.' });
99
+ return;
100
+ }
101
+ const caller = await resolveAgentCaller(req);
102
+ let server;
103
+ try {
104
+ server = await deps.servers().get(id);
105
+ }
106
+ catch {
107
+ server = undefined;
108
+ }
109
+ if (!server) {
110
+ refuse(res, body, 'No such remote MCP server on this machine.', 404);
111
+ return;
112
+ }
113
+ if (!(await deps.access().isAllowed(remoteMcpConnectorId(server.id), caller.role || 'unknown'))) {
114
+ const allowed = await deps.access().allowedRoles(remoteMcpConnectorId(server.id)).catch(() => []);
115
+ logger.warn('Remote MCP proxy: role not allowed', { id, session: caller.session, role: caller.role, allowed });
116
+ refuse(res, body, `Your role (${caller.role}) may not use ${server.label}. The owner limited it to: ${allowed.join(', ')}.`, 403);
117
+ return;
118
+ }
119
+ const auth = deps.auth();
120
+ const oauth = await auth.usesOAuth(server.id);
121
+ const needsSignIn = async () => {
122
+ void auth.onUnauthorized(server, caller.session).catch(() => undefined);
123
+ logger.info('Remote MCP proxy: owner sign-in needed', { id, session: caller.session });
124
+ refuse(res, body, `${server.label} needs the owner to sign in once. A sign-in link was sent to the owner in Slack (and is on the Connections page). Tell the owner, then try again after they authorize.`, 503, C.PROXY_NEEDS_AUTH_RPC_CODE);
125
+ };
126
+ let token = null;
127
+ if (oauth) {
128
+ token = await auth.getAccessToken(server.id);
129
+ if (!token) {
130
+ await needsSignIn();
131
+ return;
132
+ }
133
+ }
134
+ const controller = new AbortController();
135
+ // `close` on the response fires when the agent goes away (or we finish).
136
+ res.on('close', () => controller.abort());
137
+ const send = (bearer) => {
138
+ const headers = { ...(server.headers ?? {}) };
139
+ for (const name of FORWARD_REQUEST) {
140
+ const v = req.headers[name];
141
+ if (typeof v === 'string' && v)
142
+ headers[name] = v;
143
+ }
144
+ if (!headers['accept'])
145
+ headers['accept'] = 'application/json, text/event-stream';
146
+ if (bearer)
147
+ headers['Authorization'] = `Bearer ${bearer}`;
148
+ return deps.fetchImpl(server.url, { method: req.method, headers, ...(body !== undefined ? { body } : {}), signal: controller.signal });
149
+ };
150
+ let upstream;
151
+ try {
152
+ upstream = await send(token);
153
+ if (upstream.status === 401 && oauth) {
154
+ await upstream.text().catch(() => '');
155
+ const fresh = await auth.getAccessToken(server.id, { force: true });
156
+ if (!fresh) {
157
+ await needsSignIn();
158
+ return;
159
+ }
160
+ upstream = await send(fresh);
161
+ if (upstream.status === 401) {
162
+ await upstream.text().catch(() => '');
163
+ await needsSignIn();
164
+ return;
165
+ }
166
+ }
167
+ else if (upstream.status === 401) {
168
+ // A static-key server refused: the URL/key is wrong, or it moved to OAuth.
169
+ await upstream.text().catch(() => '');
170
+ logger.warn('Remote MCP proxy: upstream refused a static-key server', { id });
171
+ refuse(res, body, `${server.label} refused the request (401). The owner should press Test on it in Connections.`, 502);
172
+ return;
173
+ }
174
+ }
175
+ catch (err) {
176
+ if (controller.signal.aborted)
177
+ return;
178
+ logger.warn('Remote MCP proxy: upstream unreachable', { id, error: err instanceof Error ? err.name : 'unknown' });
179
+ refuse(res, body, `${server.label} is unreachable right now.`, 502);
180
+ return;
181
+ }
182
+ res.status(upstream.status);
183
+ for (const name of FORWARD_RESPONSE) {
184
+ const v = upstream.headers.get(name);
185
+ if (v)
186
+ res.setHeader(name, v);
187
+ }
188
+ if ((upstream.headers.get('content-type') ?? '').includes('text/event-stream')) {
189
+ res.setHeader('X-Accel-Buffering', 'no');
190
+ res.flushHeaders();
191
+ }
192
+ if (!upstream.body) {
193
+ res.end();
194
+ return;
195
+ }
196
+ const stream = Readable.fromWeb(upstream.body);
197
+ stream.on('error', () => {
198
+ if (!res.writableEnded)
199
+ res.end();
200
+ });
201
+ stream.pipe(res);
202
+ }
203
+ //# sourceMappingURL=remote-mcp-proxy.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-mcp-proxy.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp-proxy.controller.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,13 @@
10
10
  * - POST /api/connectors/remote-mcp/:id/rename — same as PATCH (relay: GET/POST only)
11
11
  * - POST /api/connectors/remote-mcp/:id/remove — same as DELETE (relay: GET/POST only)
12
12
  * - POST /api/connectors/remote-mcp/:id/access — `{ allowedRoles }` for this server only
13
+ * - POST /api/connectors/remote-mcp/:id/authorize — start (or reuse) an OAuth sign-in → `{ url, expiresAt, posted }`
14
+ *
15
+ * OAuth servers (Zoho MCP answers 401 + `resource_metadata`) are detected on
16
+ * add and on test: the response then carries `authorize: { url, expiresAt }`
17
+ * — a single-use Crewly Cloud link the owner can open on a phone — and the
18
+ * owner gets the same link as a Slack card. Each server's view carries
19
+ * `auth` (needs_auth / connected / error, scopes, expiry).
13
20
  *
14
21
  * Which agents get a server is its `mcp:<id>` allowlist
15
22
  * (`PUT /api/connectors/access/mcp:<id>`). Changes reach an agent the next
@@ -55,6 +62,15 @@ export declare function removeRemoteMcp(req: Request, res: Response): Promise<vo
55
62
  * @param res - `{ success, data: { ok, toolCount, tools, serverName? } | { ok: false, error } }`
56
63
  */
57
64
  export declare function testRemoteMcp(req: Request, res: Response): Promise<void>;
65
+ /**
66
+ * POST /api/connectors/remote-mcp/:id/authorize — body `{ notify? }`.
67
+ * Starts (or reuses) an OAuth sign-in and returns its phone-friendly link;
68
+ * `notify: true` also posts it to the owner in Slack.
69
+ *
70
+ * @param req - Request
71
+ * @param res - `{ success, data: { url, expiresAt, posted } }`
72
+ */
73
+ export declare function authorizeRemoteMcp(req: Request, res: Response): Promise<void>;
58
74
  /**
59
75
  * POST /api/connectors/remote-mcp/:id/access — body `{ allowedRoles: string[] }`
60
76
  * (empty = every agent). The same rule as `PUT /api/connectors/access/mcp:<id>`,
@@ -1 +1 @@
1
- {"version":3,"file":"remote-mcp.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AASjD,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,qFAAqF,CAAC;AAsBnH;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9E;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7E;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAahF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhF;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9E;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnF"}
1
+ {"version":3,"file":"remote-mcp.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYjD,4CAA4C;AAC5C,eAAO,MAAM,gBAAgB,qFAAqF,CAAC;AAwEnH;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9E;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC7E;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAahF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAahF;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB9E;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnF;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBnF"}
@@ -10,6 +10,13 @@
10
10
  * - POST /api/connectors/remote-mcp/:id/rename — same as PATCH (relay: GET/POST only)
11
11
  * - POST /api/connectors/remote-mcp/:id/remove — same as DELETE (relay: GET/POST only)
12
12
  * - POST /api/connectors/remote-mcp/:id/access — `{ allowedRoles }` for this server only
13
+ * - POST /api/connectors/remote-mcp/:id/authorize — start (or reuse) an OAuth sign-in → `{ url, expiresAt, posted }`
14
+ *
15
+ * OAuth servers (Zoho MCP answers 401 + `resource_metadata`) are detected on
16
+ * add and on test: the response then carries `authorize: { url, expiresAt }`
17
+ * — a single-use Crewly Cloud link the owner can open on a phone — and the
18
+ * owner gets the same link as a Slack card. Each server's view carries
19
+ * `auth` (needs_auth / connected / error, scopes, expiry).
13
20
  *
14
21
  * Which agents get a server is its `mcp:<id>` allowlist
15
22
  * (`PUT /api/connectors/access/mcp:<id>`). Changes reach an agent the next
@@ -22,6 +29,8 @@ import { rejectNonOwner } from '../../middleware/caller-identity.middleware.js';
22
29
  import { RemoteMcpService, RemoteMcpValidationError, remoteMcpConnectorId, toView } from '../../services/connector/remote-mcp.service.js';
23
30
  import { ConnectorAccessService } from '../../services/connector/connector-access.service.js';
24
31
  import { probeRemoteMcp } from '../../services/connector/remote-mcp-probe.service.js';
32
+ import { RemoteMcpAuthError, RemoteMcpAuthService } from '../../services/connector/remote-mcp-auth.service.js';
33
+ import { parseWwwAuthenticate } from '../../services/connector/remote-mcp-oauth.js';
25
34
  const logger = LoggerService.getInstance().createComponentLogger('RemoteMcpController');
26
35
  /** Told to the owner after every change. */
27
36
  export const NEXT_LAUNCH_NOTE = 'Agents pick this up the next time they start (restart an agent to apply it now).';
@@ -43,6 +52,57 @@ function fail(res, err, what) {
43
52
  logger.error(`Remote MCP: ${what} failed`, { error: err instanceof Error ? err.message : String(err) });
44
53
  res.status(500).json({ success: false, error: 'internal', message: `Could not ${what} the remote MCP server` });
45
54
  }
55
+ /**
56
+ * A server's view plus its sign-in state.
57
+ *
58
+ * @param server - Stored server
59
+ * @returns View with `auth` for OAuth servers
60
+ */
61
+ async function viewWithAuth(server) {
62
+ const auth = await RemoteMcpAuthService.getInstance().view(server.id).catch(() => undefined);
63
+ return { ...toView(server), ...(auth ? { auth } : {}) };
64
+ }
65
+ /**
66
+ * Start a sign-in and describe the outcome for a response.
67
+ *
68
+ * @param server - Stored server
69
+ * @param challenge - Raw `WWW-Authenticate`, when a probe saw one
70
+ * @param notify - Post the Slack card too
71
+ * @returns `{ url, expiresAt, posted }`, or `{ error }`
72
+ */
73
+ async function startSignIn(server, challenge, notify) {
74
+ try {
75
+ return await RemoteMcpAuthService.getInstance().startAuthorization(server, {
76
+ notify,
77
+ ...(challenge !== undefined ? { challenge: parseWwwAuthenticate(challenge) } : {}),
78
+ });
79
+ }
80
+ catch (err) {
81
+ const message = err instanceof RemoteMcpAuthError ? err.message : 'Could not start the sign-in.';
82
+ logger.warn('Remote MCP: sign-in not started', { id: server.id, error: message });
83
+ return { error: message };
84
+ }
85
+ }
86
+ /**
87
+ * Probe a server, with its OAuth token when it has one (refreshed once on 401).
88
+ *
89
+ * @param server - Stored server
90
+ * @returns Probe result
91
+ */
92
+ async function probeWithAuth(server) {
93
+ const auth = RemoteMcpAuthService.getInstance();
94
+ if (!(await auth.usesOAuth(server.id)))
95
+ return probeRemoteMcp(server);
96
+ const run = async (token) => probeRemoteMcp({ url: server.url, headers: { ...(server.headers ?? {}), ...(token ? { Authorization: `Bearer ${token}` } : {}) } });
97
+ const token = await auth.getAccessToken(server.id);
98
+ if (!token)
99
+ return { ok: false, error: 'Sign in to this server first.', needsAuth: true };
100
+ const first = await run(token);
101
+ if (first.ok || !first.needsAuth)
102
+ return first;
103
+ const fresh = await auth.getAccessToken(server.id, { force: true });
104
+ return fresh ? run(fresh) : first;
105
+ }
46
106
  /**
47
107
  * GET /api/connectors/remote-mcp
48
108
  *
@@ -54,7 +114,7 @@ export async function listRemoteMcp(req, res) {
54
114
  return;
55
115
  try {
56
116
  const servers = await RemoteMcpService.getInstance().list();
57
- res.json({ success: true, data: servers.map(toView) });
117
+ res.json({ success: true, data: await Promise.all(servers.map(viewWithAuth)) });
58
118
  }
59
119
  catch (err) {
60
120
  fail(res, err, 'list');
@@ -71,13 +131,35 @@ export async function addRemoteMcp(req, res) {
71
131
  return;
72
132
  try {
73
133
  const body = (req.body ?? {});
134
+ const clientId = typeof body.oauthClientId === 'string' ? body.oauthClientId.trim() : '';
135
+ const clientSecret = typeof body.oauthClientSecret === 'string' ? body.oauthClientSecret.trim() : '';
136
+ if ((clientId && !/^[\x21-\x7e]{1,256}$/.test(clientId)) || (clientSecret && !/^[\x21-\x7e]{1,512}$/.test(clientSecret))) {
137
+ res.status(400).json({ success: false, error: 'validation', message: 'The OAuth client ID / secret must be single-line text.' });
138
+ return;
139
+ }
74
140
  const server = await RemoteMcpService.getInstance().add({
75
141
  label: typeof body.label === 'string' ? body.label : '',
76
142
  url: typeof body.url === 'string' ? body.url : '',
77
143
  headers: body.headers,
78
144
  provider: typeof body.provider === 'string' ? body.provider : undefined,
79
145
  });
80
- res.status(201).json({ success: true, data: toView(server), note: NEXT_LAUNCH_NOTE });
146
+ // Does it want OAuth? (Zoho MCP: 401 + resource_metadata.) Then start the
147
+ // sign-in right away and send the owner the phone link.
148
+ const auth = RemoteMcpAuthService.getInstance();
149
+ if (clientId)
150
+ await auth.setManualClient(server.id, { clientId, ...(clientSecret ? { clientSecret } : {}) });
151
+ const challenge = await auth.detect(server);
152
+ let authorize;
153
+ if (challenge) {
154
+ try {
155
+ await auth.markOAuth(server, challenge);
156
+ authorize = await startSignIn(server, undefined, true);
157
+ }
158
+ catch (err) {
159
+ authorize = { error: err instanceof RemoteMcpAuthError ? err.message : 'Could not work out how to sign in to this server.' };
160
+ }
161
+ }
162
+ res.status(201).json({ success: true, data: await viewWithAuth(server), ...(authorize ? { authorize } : {}), note: NEXT_LAUNCH_NOTE });
81
163
  }
82
164
  catch (err) {
83
165
  fail(res, err, 'add');
@@ -116,6 +198,8 @@ export async function removeRemoteMcp(req, res) {
116
198
  return;
117
199
  try {
118
200
  const removed = await RemoteMcpService.getInstance().remove(String(req.params.id ?? ''));
201
+ if (removed)
202
+ await RemoteMcpAuthService.getInstance().forget(String(req.params.id ?? '')).catch(() => undefined);
119
203
  if (!removed) {
120
204
  res.status(404).json({ success: false, error: 'not_found', message: 'No such remote MCP server' });
121
205
  return;
@@ -141,14 +225,51 @@ export async function testRemoteMcp(req, res) {
141
225
  res.status(404).json({ success: false, error: 'not_found', message: 'No such remote MCP server' });
142
226
  return;
143
227
  }
144
- const result = await probeRemoteMcp(server);
145
- logger.info('Remote MCP test', { id: server.id, ok: result.ok, toolCount: result.ok ? result.toolCount : undefined });
146
- res.json({ success: true, data: result });
228
+ let result = await probeWithAuth(server);
229
+ let authorize;
230
+ if (!result.ok && result.needsAuth) {
231
+ authorize = await startSignIn(server, result.wwwAuthenticate, true);
232
+ result = { ok: false, needsAuth: true, error: 'The server wants you to sign in once. Open the authorize link (it works on your phone).' };
233
+ }
234
+ logger.info('Remote MCP test', { id: server.id, ok: result.ok, toolCount: result.ok ? result.toolCount : undefined, needsAuth: !result.ok && !!result.needsAuth });
235
+ // Never hand the raw challenge to a client.
236
+ const data = result.ok ? result : { ok: false, error: result.error, ...(result.needsAuth ? { needsAuth: true } : {}) };
237
+ res.json({ success: true, data, ...(authorize ? { authorize } : {}), server: await viewWithAuth(server) });
147
238
  }
148
239
  catch (err) {
149
240
  fail(res, err, 'test');
150
241
  }
151
242
  }
243
+ /**
244
+ * POST /api/connectors/remote-mcp/:id/authorize — body `{ notify? }`.
245
+ * Starts (or reuses) an OAuth sign-in and returns its phone-friendly link;
246
+ * `notify: true` also posts it to the owner in Slack.
247
+ *
248
+ * @param req - Request
249
+ * @param res - `{ success, data: { url, expiresAt, posted } }`
250
+ */
251
+ export async function authorizeRemoteMcp(req, res) {
252
+ if (rejectNonOwner(req, res, AGENT_REFUSAL))
253
+ return;
254
+ try {
255
+ const server = await RemoteMcpService.getInstance().get(String(req.params.id ?? ''));
256
+ if (!server) {
257
+ res.status(404).json({ success: false, error: 'not_found', message: 'No such remote MCP server' });
258
+ return;
259
+ }
260
+ const notify = req.body?.notify === true;
261
+ const out = await startSignIn(server, undefined, notify);
262
+ if ('error' in out) {
263
+ res.status(409).json({ success: false, error: 'authorize_failed', message: out.error });
264
+ return;
265
+ }
266
+ res.setHeader('Cache-Control', 'no-store');
267
+ res.json({ success: true, data: out });
268
+ }
269
+ catch (err) {
270
+ fail(res, err, 'authorize');
271
+ }
272
+ }
152
273
  /**
153
274
  * POST /api/connectors/remote-mcp/:id/access — body `{ allowedRoles: string[] }`
154
275
  * (empty = every agent). The same rule as `PUT /api/connectors/access/mcp:<id>`,
@@ -1 +1 @@
1
- {"version":3,"file":"remote-mcp.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,gDAAgD,CAAC;AAC1I,OAAO,EAAE,sBAAsB,EAAE,MAAM,sDAAsD,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,sDAAsD,CAAC;AAEtF,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;AAExF,4CAA4C;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,kFAAkF,CAAC;AAEnH,6BAA6B;AAC7B,MAAM,aAAa,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,6DAA6D,EAAE,CAAC;AAEtI;;;;;;GAMG;AACH,SAAS,IAAI,CAAC,GAAa,EAAE,GAAY,EAAE,IAAY;IACrD,IAAI,GAAG,YAAY,wBAAwB,EAAE,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IACD,6DAA6D;IAC7D,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,IAAI,wBAAwB,EAAE,CAAC,CAAC;AAClH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAY,EAAE,GAAa;IAC7D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5D,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY,EAAE,GAAa;IAC5D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAA8E,CAAC;QAC3G,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;YACtD,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACvD,GAAG,EAAE,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACjD,OAAO,EAAE,IAAI,CAAC,OAA6C;YAC3D,QAAQ,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACxE,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa;IAC/D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,KAAK,GAAI,GAAG,CAAC,IAAwC,EAAE,KAAK,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChI,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa;IAC/D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAY,EAAE,GAAa;IAC7D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACtH,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAY,EAAE,GAAa;IAClE,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC;QAAE,OAAO;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAA+B,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,mEAAmE,EAAE,CAAC,CAAC;YAC5I,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9H,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACtF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"remote-mcp.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/connector/remote-mcp.controller.ts"],"names":[],"mappings":"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"}
@@ -19,15 +19,26 @@ export interface SlackOrigin {
19
19
  threadTs?: string;
20
20
  botToken?: string;
21
21
  }
22
+ /** Human names for the products, for the card's first line. */
23
+ export declare const PRODUCT_LABELS: Record<string, string>;
22
24
  /**
23
25
  * Build the card. Pure, so the wording is testable without Slack.
24
26
  *
27
+ * A reconnect (`reconnect`) replaces the generic "Needs access" with the
28
+ * reason the harness hit — "Gmail needs re-authorization to save drafts" —
29
+ * and names the Google account, because an owner with two Gmail logins has
30
+ * to know which one to pick.
31
+ *
25
32
  * @param product - Product needing consent
26
33
  * @param url - The ticket link behind the button
27
34
  * @param expiresAt - When the link stops working
35
+ * @param reconnect - Why a working connection needs the owner again, and for which account
28
36
  * @returns Block Kit blocks and the fallback text
29
37
  */
30
- export declare function buildConnectCard(product: string, url: string, expiresAt: string): {
38
+ export declare function buildConnectCard(product: string, url: string, expiresAt: string, reconnect?: {
39
+ message: string;
40
+ account?: string;
41
+ }): {
31
42
  text: string;
32
43
  blocks: unknown[];
33
44
  };
@@ -1 +1 @@
1
- {"version":3,"file":"google-connect-card.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/google/google-connect-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKzE,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAwBrC;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAClE,+CAA+C;IAC/C,UAAU,EAAE,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,KAAK,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,8CAA8C;IAC9C,aAAa,EAAE,CACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI,CAErE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DhF"}
1
+ {"version":3,"file":"google-connect-card.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/google/google-connect-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKzE,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+DAA+D;AAC/D,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIjD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAoCrC;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAClE,+CAA+C;IAC/C,UAAU,EAAE,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,KAAK,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,8CAA8C;IAC9C,aAAa,EAAE,CACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI,CAErE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DhF"}