@agent-deck/backend 1.1.4 → 1.1.5
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/dist/.tsbuildinfo +1 -1
- package/dist/config/oauth-redirect.d.ts +13 -0
- package/dist/config/oauth-redirect.d.ts.map +1 -0
- package/dist/config/oauth-redirect.js +31 -0
- package/dist/config/oauth-redirect.js.map +1 -0
- package/dist/config/shared-oauth-apps.d.ts +18 -0
- package/dist/config/shared-oauth-apps.d.ts.map +1 -0
- package/dist/config/shared-oauth-apps.js +35 -0
- package/dist/config/shared-oauth-apps.js.map +1 -0
- package/dist/data/default-mcp-services.d.ts +11 -0
- package/dist/data/default-mcp-services.d.ts.map +1 -0
- package/dist/data/default-mcp-services.js +77 -0
- package/dist/data/default-mcp-services.js.map +1 -0
- package/dist/data/oauth-provider-guides.d.ts +23 -0
- package/dist/data/oauth-provider-guides.d.ts.map +1 -0
- package/dist/data/oauth-provider-guides.js +180 -0
- package/dist/data/oauth-provider-guides.js.map +1 -0
- package/dist/data/seed-default-services.d.ts +3 -0
- package/dist/data/seed-default-services.d.ts.map +1 -0
- package/dist/data/seed-default-services.js +14 -0
- package/dist/data/seed-default-services.js.map +1 -0
- package/dist/lib/mcp-oauth-discovery.d.ts +16 -0
- package/dist/lib/mcp-oauth-discovery.d.ts.map +1 -0
- package/dist/lib/mcp-oauth-discovery.js +161 -0
- package/dist/lib/mcp-oauth-discovery.js.map +1 -0
- package/dist/lib/pkce.d.ts +7 -0
- package/dist/lib/pkce.d.ts.map +1 -0
- package/dist/lib/pkce.js +11 -0
- package/dist/lib/pkce.js.map +1 -0
- package/dist/models/database.d.ts +1 -0
- package/dist/models/database.d.ts.map +1 -1
- package/dist/models/database.js +4 -0
- package/dist/models/database.js.map +1 -1
- package/dist/routes/oauth.d.ts.map +1 -1
- package/dist/routes/oauth.js +85 -48
- package/dist/routes/oauth.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -1
- package/dist/services/collection-warning-service.d.ts.map +1 -1
- package/dist/services/collection-warning-service.js +1 -5
- package/dist/services/collection-warning-service.js.map +1 -1
- package/dist/services/mcp-discovery-service.d.ts +1 -0
- package/dist/services/mcp-discovery-service.d.ts.map +1 -1
- package/dist/services/mcp-discovery-service.js +2 -79
- package/dist/services/mcp-discovery-service.js.map +1 -1
- package/dist/services/oauth-connect-service.d.ts +26 -0
- package/dist/services/oauth-connect-service.d.ts.map +1 -0
- package/dist/services/oauth-connect-service.js +111 -0
- package/dist/services/oauth-connect-service.js.map +1 -0
- package/dist/services/oauth-manager.d.ts.map +1 -1
- package/dist/services/oauth-manager.js +69 -62
- package/dist/services/oauth-manager.js.map +1 -1
- package/package.json +4 -4
- package/static-ui/assets/index-C9xsIiR9.css +1 -0
- package/static-ui/assets/index-CExp-xnm.js +344 -0
- package/static-ui/index.html +2 -2
- package/static-ui/assets/index-BMpKtwqp.js +0 -339
- package/static-ui/assets/index-BnA3AsqY.css +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_MCP_SERVICES = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Preset remote MCP service cards seeded on first install (empty services table).
|
|
6
|
+
* Users can delete cards they do not need. Not re-added on subsequent starts.
|
|
7
|
+
*
|
|
8
|
+
* Skipped:
|
|
9
|
+
* - Docmost — requires a self-hosted instance URL per user
|
|
10
|
+
* - Obsidian — local MCP (stdio); not a remote HTTP preset
|
|
11
|
+
*/
|
|
12
|
+
exports.DEFAULT_MCP_SERVICES = [
|
|
13
|
+
{
|
|
14
|
+
name: 'Linear',
|
|
15
|
+
type: 'mcp',
|
|
16
|
+
url: 'https://mcp.linear.app/mcp',
|
|
17
|
+
description: 'Issues, projects, and team workflows in Linear',
|
|
18
|
+
cardColor: '#5E6AD2',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'GitHub',
|
|
22
|
+
type: 'mcp',
|
|
23
|
+
url: 'https://api.githubcopilot.com/mcp/',
|
|
24
|
+
description: 'Repositories, issues, and pull requests via GitHub Copilot MCP',
|
|
25
|
+
cardColor: '#24292F',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'Notion',
|
|
29
|
+
type: 'mcp',
|
|
30
|
+
url: 'https://mcp.notion.com/mcp',
|
|
31
|
+
description: 'Pages, databases, and workspace content in Notion',
|
|
32
|
+
cardColor: '#37352F',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: 'Gmail',
|
|
36
|
+
type: 'mcp',
|
|
37
|
+
url: 'https://gmailmcp.googleapis.com/mcp/v1',
|
|
38
|
+
description: 'Read and manage Gmail messages',
|
|
39
|
+
cardColor: '#EA4335',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'Google Calendar',
|
|
43
|
+
type: 'mcp',
|
|
44
|
+
url: 'https://calendarmcp.googleapis.com/mcp/v1',
|
|
45
|
+
description: 'Events and schedules in Google Calendar',
|
|
46
|
+
cardColor: '#4285F4',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'Google Drive',
|
|
50
|
+
type: 'mcp',
|
|
51
|
+
url: 'https://drivemcp.googleapis.com/mcp/v1',
|
|
52
|
+
description: 'Files and folders in Google Drive',
|
|
53
|
+
cardColor: '#0F9D58',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'Draw.io',
|
|
57
|
+
type: 'mcp',
|
|
58
|
+
url: 'https://mcp.draw.io/mcp',
|
|
59
|
+
description: 'Diagrams and whiteboards with draw.io',
|
|
60
|
+
cardColor: '#F08705',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'Slack',
|
|
64
|
+
type: 'mcp',
|
|
65
|
+
url: 'https://mcp.slack.com/mcp',
|
|
66
|
+
description: 'Channels, messages, and workspace actions in Slack',
|
|
67
|
+
cardColor: '#4A154B',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'Figma',
|
|
71
|
+
type: 'mcp',
|
|
72
|
+
url: 'https://mcp.figma.com/mcp',
|
|
73
|
+
description: 'Design files, components, and comments in Figma',
|
|
74
|
+
cardColor: '#F24E1E',
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
//# sourceMappingURL=default-mcp-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-mcp-services.js","sourceRoot":"","sources":["../../src/data/default-mcp-services.ts"],"names":[],"mappings":";;;AAEA;;;;;;;GAOG;AACU,QAAA,oBAAoB,GAAyB;IACxD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,4BAA4B;QACjC,WAAW,EAAE,gDAAgD;QAC7D,SAAS,EAAE,SAAS;KACrB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,oCAAoC;QACzC,WAAW,EAAE,gEAAgE;QAC7E,SAAS,EAAE,SAAS;KACrB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,4BAA4B;QACjC,WAAW,EAAE,mDAAmD;QAChE,SAAS,EAAE,SAAS;KACrB;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,wCAAwC;QAC7C,WAAW,EAAE,gCAAgC;QAC7C,SAAS,EAAE,SAAS;KACrB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,2CAA2C;QAChD,WAAW,EAAE,yCAAyC;QACtD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,wCAAwC;QAC7C,WAAW,EAAE,mCAAmC;QAChD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,yBAAyB;QAC9B,WAAW,EAAE,uCAAuC;QACpD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,2BAA2B;QAChC,WAAW,EAAE,oDAAoD;QACjE,SAAS,EAAE,SAAS;KACrB;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,2BAA2B;QAChC,WAAW,EAAE,iDAAiD;QAC9D,SAAS,EAAE,SAAS;KACrB;CACF,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type OAuthSetupMode = 'dynamic' | 'managed' | 'manual' | 'unavailable';
|
|
2
|
+
export type OAuthProviderGuide = {
|
|
3
|
+
provider: string;
|
|
4
|
+
setupMode: OAuthSetupMode;
|
|
5
|
+
title: string;
|
|
6
|
+
redirectUri: string;
|
|
7
|
+
steps: string[];
|
|
8
|
+
docsUrl?: string;
|
|
9
|
+
unavailableReason?: string;
|
|
10
|
+
/** Pre-filled app manifest (Slack: paste at Create New App → From a manifest). */
|
|
11
|
+
manifestJson?: string;
|
|
12
|
+
/** Deep link to provider app creation UI. */
|
|
13
|
+
createAppUrl?: string;
|
|
14
|
+
/** Shorter alternative when full setup is too heavy. */
|
|
15
|
+
easierAlternative?: string;
|
|
16
|
+
};
|
|
17
|
+
/** Slack MCP app manifest with redirect URI and common user scopes pre-filled. */
|
|
18
|
+
export declare function getSlackMcpAppManifest(redirectUri?: string): string;
|
|
19
|
+
export declare function inferOAuthProvider(serviceUrl: string, authServers?: string[]): string;
|
|
20
|
+
export declare function resolveOAuthSetupMode(provider: string, supportsDynamicRegistration?: boolean): OAuthSetupMode;
|
|
21
|
+
export declare function getOAuthProviderGuide(provider: string): OAuthProviderGuide;
|
|
22
|
+
export { getOAuthRedirectUri } from '../config/oauth-redirect';
|
|
23
|
+
//# sourceMappingURL=oauth-provider-guides.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider-guides.d.ts","sourceRoot":"","sources":["../../src/data/oauth-provider-guides.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC;AAK9E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,WAAW,SAAwB,GAAG,MAAM,CA8ClF;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,EAAO,GAAG,MAAM,CAazF;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,2BAA2B,CAAC,EAAE,OAAO,GACpC,cAAc,CAMhB;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAkG1E;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getOAuthRedirectUri = void 0;
|
|
4
|
+
exports.getSlackMcpAppManifest = getSlackMcpAppManifest;
|
|
5
|
+
exports.inferOAuthProvider = inferOAuthProvider;
|
|
6
|
+
exports.resolveOAuthSetupMode = resolveOAuthSetupMode;
|
|
7
|
+
exports.getOAuthProviderGuide = getOAuthProviderGuide;
|
|
8
|
+
const shared_oauth_apps_1 = require("../config/shared-oauth-apps");
|
|
9
|
+
const oauth_redirect_1 = require("../config/oauth-redirect");
|
|
10
|
+
/** Slack MCP app manifest with redirect URI and common user scopes pre-filled. */
|
|
11
|
+
function getSlackMcpAppManifest(redirectUri = (0, oauth_redirect_1.getOAuthRedirectUri)()) {
|
|
12
|
+
return JSON.stringify({
|
|
13
|
+
display_information: {
|
|
14
|
+
name: 'Agent Deck',
|
|
15
|
+
description: 'Connect AI agents to your Slack workspace through Agent Deck.',
|
|
16
|
+
long_description: 'Agent Deck lets you authorize Slack so AI agents can read and search channels and direct messages you belong to, and send messages when you approve. Each user connects with their own Slack account. Tokens are stored on your Agent Deck instance.',
|
|
17
|
+
background_color: '#2c2d30',
|
|
18
|
+
},
|
|
19
|
+
features: {
|
|
20
|
+
bot_user: {
|
|
21
|
+
display_name: 'Agent Deck MCP',
|
|
22
|
+
always_online: false,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
oauth_config: {
|
|
26
|
+
redirect_urls: [redirectUri],
|
|
27
|
+
scopes: {
|
|
28
|
+
bot: ['users:read'],
|
|
29
|
+
user: [
|
|
30
|
+
'search:read.public',
|
|
31
|
+
'search:read.private',
|
|
32
|
+
'search:read.mpim',
|
|
33
|
+
'search:read.im',
|
|
34
|
+
'search:read.files',
|
|
35
|
+
'search:read.users',
|
|
36
|
+
'chat:write',
|
|
37
|
+
'channels:history',
|
|
38
|
+
'groups:history',
|
|
39
|
+
'mpim:history',
|
|
40
|
+
'im:history',
|
|
41
|
+
'canvases:read',
|
|
42
|
+
'canvases:write',
|
|
43
|
+
'users:read',
|
|
44
|
+
'users:read.email',
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
settings: {
|
|
49
|
+
org_deploy_enabled: true,
|
|
50
|
+
},
|
|
51
|
+
}, null, 2);
|
|
52
|
+
}
|
|
53
|
+
function inferOAuthProvider(serviceUrl, authServers = []) {
|
|
54
|
+
const url = serviceUrl.toLowerCase();
|
|
55
|
+
if (url.includes('figma.com'))
|
|
56
|
+
return 'figma';
|
|
57
|
+
if (url.includes('slack.com'))
|
|
58
|
+
return 'slack';
|
|
59
|
+
if (url.includes('googleapis.com') || authServers.some((s) => s.includes('accounts.google.com'))) {
|
|
60
|
+
return 'google';
|
|
61
|
+
}
|
|
62
|
+
if (url.includes('linear.app'))
|
|
63
|
+
return 'linear';
|
|
64
|
+
if (url.includes('notion.com'))
|
|
65
|
+
return 'notion';
|
|
66
|
+
if (url.includes('githubcopilot.com') || authServers.some((s) => s.includes('github.com'))) {
|
|
67
|
+
return 'github';
|
|
68
|
+
}
|
|
69
|
+
return 'custom';
|
|
70
|
+
}
|
|
71
|
+
function resolveOAuthSetupMode(provider, supportsDynamicRegistration) {
|
|
72
|
+
if (provider === 'figma')
|
|
73
|
+
return 'unavailable';
|
|
74
|
+
if ((0, shared_oauth_apps_1.hasSharedOAuthApp)(provider))
|
|
75
|
+
return 'managed';
|
|
76
|
+
if (supportsDynamicRegistration)
|
|
77
|
+
return 'dynamic';
|
|
78
|
+
if (provider === 'linear' || provider === 'notion')
|
|
79
|
+
return 'dynamic';
|
|
80
|
+
return 'manual';
|
|
81
|
+
}
|
|
82
|
+
function getOAuthProviderGuide(provider) {
|
|
83
|
+
const redirectUri = (0, oauth_redirect_1.getOAuthRedirectUri)();
|
|
84
|
+
const base = {
|
|
85
|
+
provider,
|
|
86
|
+
redirectUri,
|
|
87
|
+
};
|
|
88
|
+
switch (provider) {
|
|
89
|
+
case 'google':
|
|
90
|
+
return {
|
|
91
|
+
...base,
|
|
92
|
+
setupMode: 'manual',
|
|
93
|
+
title: 'Google OAuth app',
|
|
94
|
+
docsUrl: 'https://developers.google.com/workspace/guides/configure-mcp-servers',
|
|
95
|
+
steps: [
|
|
96
|
+
'Open Google Cloud Console → APIs & Services → Credentials.',
|
|
97
|
+
'Create an OAuth 2.0 Client ID (type: Web application or Desktop).',
|
|
98
|
+
`Add authorized redirect URI: ${redirectUri}`,
|
|
99
|
+
'Enable the Gmail / Calendar / Drive MCP APIs for your project if prompted.',
|
|
100
|
+
'Paste the Client ID and Client Secret below, then click Connect.',
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
case 'slack':
|
|
104
|
+
if ((0, shared_oauth_apps_1.hasSharedOAuthApp)('slack')) {
|
|
105
|
+
return {
|
|
106
|
+
...base,
|
|
107
|
+
setupMode: 'managed',
|
|
108
|
+
title: 'Slack',
|
|
109
|
+
docsUrl: 'https://docs.slack.dev/ai/slack-mcp-server/',
|
|
110
|
+
steps: [
|
|
111
|
+
'Click Connect — Agent Deck uses the shared Slack OAuth app.',
|
|
112
|
+
'Sign in and approve access for your workspace (one time per workspace).',
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
...base,
|
|
118
|
+
setupMode: 'manual',
|
|
119
|
+
title: 'Slack MCP (~10 min, one-time)',
|
|
120
|
+
docsUrl: 'https://docs.slack.dev/ai/slack-mcp-server/',
|
|
121
|
+
createAppUrl: 'https://api.slack.com/apps/new',
|
|
122
|
+
manifestJson: getSlackMcpAppManifest(redirectUri),
|
|
123
|
+
easierAlternative: 'If this is too much: use Slack MCP inside Cursor or Claude Code (partner apps), and keep this card as a reminder—or wait for a future Agent Deck shared OAuth app.',
|
|
124
|
+
steps: [
|
|
125
|
+
...((0, oauth_redirect_1.isOAuthRedirectHttps)()
|
|
126
|
+
? []
|
|
127
|
+
: [
|
|
128
|
+
'Set AGENT_DECK_PUBLIC_URL to your Agent Deck HTTPS origin (e.g. https://oauth.agent-deck.dev) so the manifest redirect URL uses https:// — required for Slack public distribution.',
|
|
129
|
+
]),
|
|
130
|
+
'Use the buttons below: copy the manifest → open Slack app creator → Create New App → From a manifest → paste → Create.',
|
|
131
|
+
'In the new app: Agents & AI Apps → enable Model Context Protocol (MCP). OAuth & Permissions → opt in to PKCE if shown.',
|
|
132
|
+
'Basic Information → copy Client ID and Client Secret → paste below → Connect → approve in browser.',
|
|
133
|
+
],
|
|
134
|
+
};
|
|
135
|
+
case 'figma':
|
|
136
|
+
return {
|
|
137
|
+
...base,
|
|
138
|
+
setupMode: 'unavailable',
|
|
139
|
+
title: 'Figma remote MCP',
|
|
140
|
+
docsUrl: 'https://developers.figma.com/docs/figma-mcp-server/remote-server-installation/',
|
|
141
|
+
unavailableReason: 'Figma remote MCP only allows OAuth from approved clients (Cursor, Claude Code, VS Code). Agent Deck cannot complete OAuth until Figma opens third-party registration. Use Figma in your agent app directly, or add a local MCP with a Figma personal access token.',
|
|
142
|
+
steps: [],
|
|
143
|
+
};
|
|
144
|
+
case 'github':
|
|
145
|
+
return {
|
|
146
|
+
...base,
|
|
147
|
+
setupMode: 'manual',
|
|
148
|
+
title: 'GitHub',
|
|
149
|
+
docsUrl: 'https://docs.github.com/en/apps/oauth-apps',
|
|
150
|
+
steps: [
|
|
151
|
+
'Create a GitHub OAuth App or use a fine-grained Personal Access Token.',
|
|
152
|
+
`For OAuth app, set callback URL: ${redirectUri}`,
|
|
153
|
+
'Alternatively set Authorization: Bearer <PAT> in service headers.',
|
|
154
|
+
'Paste Client ID and Secret below for OAuth, then Connect.',
|
|
155
|
+
],
|
|
156
|
+
};
|
|
157
|
+
case 'linear':
|
|
158
|
+
case 'notion':
|
|
159
|
+
return {
|
|
160
|
+
...base,
|
|
161
|
+
setupMode: 'dynamic',
|
|
162
|
+
title: provider === 'linear' ? 'Linear' : 'Notion',
|
|
163
|
+
steps: ['Click Connect — Agent Deck registers automatically and opens the login page.'],
|
|
164
|
+
};
|
|
165
|
+
default:
|
|
166
|
+
return {
|
|
167
|
+
...base,
|
|
168
|
+
setupMode: 'manual',
|
|
169
|
+
title: 'OAuth application',
|
|
170
|
+
steps: [
|
|
171
|
+
'Create an OAuth app with this MCP provider.',
|
|
172
|
+
`Set redirect URI to: ${redirectUri}`,
|
|
173
|
+
'Paste Client ID and Client Secret below, then Connect.',
|
|
174
|
+
],
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
var oauth_redirect_2 = require("../config/oauth-redirect");
|
|
179
|
+
Object.defineProperty(exports, "getOAuthRedirectUri", { enumerable: true, get: function () { return oauth_redirect_2.getOAuthRedirectUri; } });
|
|
180
|
+
//# sourceMappingURL=oauth-provider-guides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider-guides.js","sourceRoot":"","sources":["../../src/data/oauth-provider-guides.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-default-services.d.ts","sourceRoot":"","sources":["../../src/data/seed-default-services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAUrF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.seedDefaultServicesIfEmpty = seedDefaultServicesIfEmpty;
|
|
4
|
+
const default_mcp_services_1 = require("./default-mcp-services");
|
|
5
|
+
async function seedDefaultServicesIfEmpty(db) {
|
|
6
|
+
if (db.hasAnyServices()) {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
for (const preset of default_mcp_services_1.DEFAULT_MCP_SERVICES) {
|
|
10
|
+
await db.createService(preset);
|
|
11
|
+
}
|
|
12
|
+
return default_mcp_services_1.DEFAULT_MCP_SERVICES.length;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=seed-default-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed-default-services.js","sourceRoot":"","sources":["../../src/data/seed-default-services.ts"],"names":[],"mappings":";;AAGA,gEAUC;AAZD,iEAA8D;AAEvD,KAAK,UAAU,0BAA0B,CAAC,EAAmB;IAClE,IAAI,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,2CAAoB,EAAE,CAAC;QAC1C,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,2CAAoB,CAAC,MAAM,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type OAuthSetupMode } from '../data/oauth-provider-guides';
|
|
2
|
+
export type McpOAuthDiscovery = {
|
|
3
|
+
required: boolean;
|
|
4
|
+
resourceName?: string;
|
|
5
|
+
issuer?: string;
|
|
6
|
+
authorizationUrl?: string;
|
|
7
|
+
tokenUrl?: string;
|
|
8
|
+
scopesSupported?: string[];
|
|
9
|
+
bearerMethodsSupported?: string[];
|
|
10
|
+
provider?: string;
|
|
11
|
+
setupMode?: OAuthSetupMode;
|
|
12
|
+
supportsDynamicRegistration?: boolean;
|
|
13
|
+
error?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function discoverMcpOAuthRequirements(serviceUrl: string): Promise<McpOAuthDiscovery>;
|
|
16
|
+
//# sourceMappingURL=mcp-oauth-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-oauth-discovery.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-oauth-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AAkBvC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAqJF,wBAAsB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2CjG"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.discoverMcpOAuthRequirements = discoverMcpOAuthRequirements;
|
|
4
|
+
const oauth_provider_guides_1 = require("../data/oauth-provider-guides");
|
|
5
|
+
function finalizeOAuthDiscovery(serviceUrl, oauth, authServers = []) {
|
|
6
|
+
const provider = oauth.provider ?? (0, oauth_provider_guides_1.inferOAuthProvider)(serviceUrl, authServers);
|
|
7
|
+
const setupMode = (0, oauth_provider_guides_1.resolveOAuthSetupMode)(provider, oauth.supportsDynamicRegistration);
|
|
8
|
+
return {
|
|
9
|
+
...oauth,
|
|
10
|
+
provider,
|
|
11
|
+
setupMode,
|
|
12
|
+
supportsDynamicRegistration: setupMode === 'dynamic' ? true : oauth.supportsDynamicRegistration ?? false,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function protectedResourceCandidates(serviceUrl) {
|
|
16
|
+
const parsed = new URL(serviceUrl);
|
|
17
|
+
const path = parsed.pathname.replace(/\/$/, '');
|
|
18
|
+
const candidates = new Set([
|
|
19
|
+
`${parsed.origin}/.well-known/oauth-protected-resource`,
|
|
20
|
+
]);
|
|
21
|
+
if (path && path !== '/') {
|
|
22
|
+
candidates.add(`${parsed.origin}/.well-known/oauth-protected-resource${path}`);
|
|
23
|
+
candidates.add(`${parsed.origin}/.well-known/oauth-protected-resource${path}/`);
|
|
24
|
+
}
|
|
25
|
+
return [...candidates];
|
|
26
|
+
}
|
|
27
|
+
async function fetchJson(url) {
|
|
28
|
+
try {
|
|
29
|
+
const response = await fetch(url, {
|
|
30
|
+
headers: { Accept: 'application/json' },
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return response.json();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function fetchAuthorizationServerMetadata(issuerOrAsUrl) {
|
|
42
|
+
const trimmed = issuerOrAsUrl.replace(/\/$/, '');
|
|
43
|
+
const candidates = trimmed.includes('/.well-known/')
|
|
44
|
+
? [trimmed]
|
|
45
|
+
: [
|
|
46
|
+
`${trimmed}/.well-known/oauth-authorization-server`,
|
|
47
|
+
`${trimmed}/.well-known/openid-configuration`,
|
|
48
|
+
];
|
|
49
|
+
for (const candidate of candidates) {
|
|
50
|
+
const data = await fetchJson(candidate);
|
|
51
|
+
if (data && typeof data === 'object') {
|
|
52
|
+
return data;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
function applyKnownProviderFallbacks(serviceUrl, authServers, oauth) {
|
|
58
|
+
if (authServers.some((server) => server.includes('github.com/login/oauth'))) {
|
|
59
|
+
return finalizeOAuthDiscovery(serviceUrl, {
|
|
60
|
+
...oauth,
|
|
61
|
+
required: true,
|
|
62
|
+
provider: 'github',
|
|
63
|
+
authorizationUrl: 'https://github.com/login/oauth/authorize',
|
|
64
|
+
tokenUrl: 'https://github.com/login/oauth/access_token',
|
|
65
|
+
supportsDynamicRegistration: false,
|
|
66
|
+
}, authServers);
|
|
67
|
+
}
|
|
68
|
+
return finalizeOAuthDiscovery(serviceUrl, oauth, authServers);
|
|
69
|
+
}
|
|
70
|
+
async function resolveFromProtectedResource(serviceUrl, metadata) {
|
|
71
|
+
const oauth = {
|
|
72
|
+
required: true,
|
|
73
|
+
resourceName: metadata.resource_name ?? metadata.resource,
|
|
74
|
+
scopesSupported: metadata.scopes_supported ?? [],
|
|
75
|
+
bearerMethodsSupported: metadata.bearer_methods_supported ?? [],
|
|
76
|
+
};
|
|
77
|
+
const authServers = metadata.authorization_servers ?? [];
|
|
78
|
+
if (authServers.length === 0) {
|
|
79
|
+
return finalizeOAuthDiscovery(serviceUrl, oauth, authServers);
|
|
80
|
+
}
|
|
81
|
+
const asMeta = await fetchAuthorizationServerMetadata(authServers[0]);
|
|
82
|
+
if (asMeta) {
|
|
83
|
+
oauth.issuer = asMeta.issuer;
|
|
84
|
+
oauth.authorizationUrl = asMeta.authorization_endpoint;
|
|
85
|
+
oauth.tokenUrl = asMeta.token_endpoint;
|
|
86
|
+
oauth.scopesSupported = asMeta.scopes_supported ?? oauth.scopesSupported;
|
|
87
|
+
oauth.supportsDynamicRegistration = Boolean(asMeta.registration_endpoint);
|
|
88
|
+
}
|
|
89
|
+
return applyKnownProviderFallbacks(serviceUrl, authServers, oauth);
|
|
90
|
+
}
|
|
91
|
+
async function probeWwwAuthenticate(serviceUrl) {
|
|
92
|
+
const headers = {
|
|
93
|
+
Accept: 'application/json, text/event-stream',
|
|
94
|
+
'Content-Type': 'application/json',
|
|
95
|
+
};
|
|
96
|
+
for (const method of ['GET', 'POST']) {
|
|
97
|
+
try {
|
|
98
|
+
const init = method === 'GET'
|
|
99
|
+
? { method, headers: { Accept: headers.Accept } }
|
|
100
|
+
: {
|
|
101
|
+
method,
|
|
102
|
+
headers,
|
|
103
|
+
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/list', params: {} }),
|
|
104
|
+
};
|
|
105
|
+
const response = await fetch(serviceUrl, init);
|
|
106
|
+
const wwwAuth = response.headers.get('www-authenticate');
|
|
107
|
+
if (wwwAuth) {
|
|
108
|
+
return wwwAuth;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// try next method
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
function parseResourceMetadataUrl(wwwAuthenticate) {
|
|
118
|
+
const match = wwwAuthenticate.match(/resource_metadata="([^"]+)"/i);
|
|
119
|
+
return match?.[1] ?? null;
|
|
120
|
+
}
|
|
121
|
+
async function discoverMcpOAuthRequirements(serviceUrl) {
|
|
122
|
+
const oauth = { required: false };
|
|
123
|
+
try {
|
|
124
|
+
for (const candidate of protectedResourceCandidates(serviceUrl)) {
|
|
125
|
+
const data = await fetchJson(candidate);
|
|
126
|
+
if (data && typeof data === 'object') {
|
|
127
|
+
return resolveFromProtectedResource(serviceUrl, data);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const parsed = new URL(serviceUrl);
|
|
131
|
+
const asData = await fetchAuthorizationServerMetadata(parsed.origin);
|
|
132
|
+
if (asData?.authorization_endpoint) {
|
|
133
|
+
return finalizeOAuthDiscovery(serviceUrl, {
|
|
134
|
+
required: true,
|
|
135
|
+
issuer: asData.issuer,
|
|
136
|
+
authorizationUrl: asData.authorization_endpoint,
|
|
137
|
+
tokenUrl: asData.token_endpoint,
|
|
138
|
+
scopesSupported: asData.scopes_supported ?? [],
|
|
139
|
+
supportsDynamicRegistration: Boolean(asData.registration_endpoint),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const wwwAuth = await probeWwwAuthenticate(serviceUrl);
|
|
143
|
+
if (wwwAuth) {
|
|
144
|
+
const resourceMetadataUrl = parseResourceMetadataUrl(wwwAuth);
|
|
145
|
+
if (resourceMetadataUrl) {
|
|
146
|
+
const data = await fetchJson(resourceMetadataUrl);
|
|
147
|
+
if (data && typeof data === 'object') {
|
|
148
|
+
return resolveFromProtectedResource(serviceUrl, data);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (wwwAuth.toLowerCase().includes('oauth') || wwwAuth.toLowerCase().includes('bearer')) {
|
|
152
|
+
return finalizeOAuthDiscovery(serviceUrl, { required: true });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
oauth.error = error instanceof Error ? error.message : 'OAuth detection failed';
|
|
158
|
+
}
|
|
159
|
+
return oauth;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=mcp-oauth-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-oauth-discovery.js","sourceRoot":"","sources":["../../src/lib/mcp-oauth-discovery.ts"],"names":[],"mappings":";;AAuLA,oEA2CC;AAlOD,yEAIuC;AAgCvC,SAAS,sBAAsB,CAC7B,UAAkB,EAClB,KAAwB,EACxB,cAAwB,EAAE;IAE1B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAA,0CAAkB,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,IAAA,6CAAqB,EAAC,QAAQ,EAAE,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACrF,OAAO;QACL,GAAG,KAAK;QACR,QAAQ;QACR,SAAS;QACT,2BAA2B,EACzB,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,2BAA2B,IAAI,KAAK;KAC9E,CAAC;AACJ,CAAC;AAED,SAAS,2BAA2B,CAAC,UAAkB;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS;QACjC,GAAG,MAAM,CAAC,MAAM,uCAAuC;KACxD,CAAC,CAAC;IAEH,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACzB,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,wCAAwC,IAAI,EAAE,CAAC,CAAC;QAC/E,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,wCAAwC,IAAI,GAAG,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gCAAgC,CAC7C,aAAqB;IAErB,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;QAClD,CAAC,CAAC,CAAC,OAAO,CAAC;QACX,CAAC,CAAC;YACE,GAAG,OAAO,yCAAyC;YACnD,GAAG,OAAO,mCAAmC;SAC9C,CAAC;IAEN,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrC,OAAO,IAAmC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,2BAA2B,CAClC,UAAkB,EAClB,WAAqB,EACrB,KAAwB;IAExB,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO,sBAAsB,CAAC,UAAU,EAAE;YACxC,GAAG,KAAK;YACR,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,QAAQ;YAClB,gBAAgB,EAAE,0CAA0C;YAC5D,QAAQ,EAAE,6CAA6C;YACvD,2BAA2B,EAAE,KAAK;SACnC,EAAE,WAAW,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,sBAAsB,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,UAAkB,EAClB,QAAmC;IAEnC,MAAM,KAAK,GAAsB;QAC/B,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,QAAQ;QACzD,eAAe,EAAE,QAAQ,CAAC,gBAAgB,IAAI,EAAE;QAChD,sBAAsB,EAAE,QAAQ,CAAC,wBAAwB,IAAI,EAAE;KAChE,CAAC;IAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,qBAAqB,IAAI,EAAE,CAAC;IACzD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,sBAAsB,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,gCAAgC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC;IACvE,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,KAAK,CAAC,gBAAgB,GAAG,MAAM,CAAC,sBAAsB,CAAC;QACvD,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;QACvC,KAAK,CAAC,eAAe,GAAG,MAAM,CAAC,gBAAgB,IAAI,KAAK,CAAC,eAAe,CAAC;QACzE,KAAK,CAAC,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,2BAA2B,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,UAAkB;IACpD,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,qCAAqC;QAC7C,cAAc,EAAE,kBAAkB;KACnC,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,CAAU,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,GACR,MAAM,KAAK,KAAK;gBACd,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE;gBACjD,CAAC,CAAC;oBACE,MAAM;oBACN,OAAO;oBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;iBAClF,CAAC;YACR,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACzD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAAC,eAAuB;IACvD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC;AAEM,KAAK,UAAU,4BAA4B,CAAC,UAAkB;IACnE,MAAM,KAAK,GAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAErD,IAAI,CAAC;QACH,KAAK,MAAM,SAAS,IAAI,2BAA2B,CAAC,UAAU,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,OAAO,4BAA4B,CAAC,UAAU,EAAE,IAAiC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,gCAAgC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,MAAM,EAAE,sBAAsB,EAAE,CAAC;YACnC,OAAO,sBAAsB,CAAC,UAAU,EAAE;gBACxC,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,gBAAgB,EAAE,MAAM,CAAC,sBAAsB;gBAC/C,QAAQ,EAAE,MAAM,CAAC,cAAc;gBAC/B,eAAe,EAAE,MAAM,CAAC,gBAAgB,IAAI,EAAE;gBAC9C,2BAA2B,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC;aACnE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,mBAAmB,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;gBAClD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,OAAO,4BAA4B,CAAC,UAAU,EAAE,IAAiC,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxF,OAAO,sBAAsB,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;IAClF,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,8CAA8C;AAC9C,wBAAgB,gBAAgB,IAAI,QAAQ,CAI3C"}
|
package/dist/lib/pkce.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generatePkcePair = generatePkcePair;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
/** RFC 7636 PKCE with S256 code challenge. */
|
|
6
|
+
function generatePkcePair() {
|
|
7
|
+
const codeVerifier = (0, crypto_1.randomBytes)(32).toString('base64url');
|
|
8
|
+
const codeChallenge = (0, crypto_1.createHash)('sha256').update(codeVerifier).digest('base64url');
|
|
9
|
+
return { codeVerifier, codeChallenge };
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=pkce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":";;AAQA,4CAIC;AAZD,mCAAiD;AAOjD,8CAA8C;AAC9C,SAAgB,gBAAgB;IAC9B,MAAM,YAAY,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACpF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/models/database.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/models/database.ts"],"names":[],"mappings":"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"}
|
package/dist/models/database.js
CHANGED
|
@@ -182,6 +182,10 @@ class DatabaseManager {
|
|
|
182
182
|
)
|
|
183
183
|
`);
|
|
184
184
|
}
|
|
185
|
+
hasAnyServices() {
|
|
186
|
+
const row = this.db.prepare('SELECT 1 FROM services LIMIT 1').get();
|
|
187
|
+
return row !== undefined;
|
|
188
|
+
}
|
|
185
189
|
createIndexes() {
|
|
186
190
|
this.db.exec(`
|
|
187
191
|
CREATE INDEX IF NOT EXISTS idx_services_type ON services(type);
|