@qelos/sdk 4.1.1 → 4.2.1
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/README.md +81 -0
- package/dist/administrator/integration-sources.d.ts +3 -1
- package/dist/administrator/integration-sources.js +14 -0
- package/dist/administrator/integration-sources.js.map +1 -1
- package/dist/administrator/integrations.d.ts +2 -0
- package/dist/administrator/integrations.js.map +1 -1
- package/dist/administrator/payments.d.ts +17 -1
- package/dist/administrator/payments.js +12 -0
- package/dist/administrator/payments.js.map +1 -1
- package/dist/administrator/tests/integration-sources-status.test.d.ts +1 -0
- package/dist/administrator/tests/integration-sources-status.test.js +105 -0
- package/dist/administrator/tests/integration-sources-status.test.js.map +1 -0
- package/dist/authentication.d.ts +5 -0
- package/dist/authentication.js +39 -0
- package/dist/authentication.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-auth.d.ts +76 -0
- package/dist/mcp-auth.js +216 -0
- package/dist/mcp-auth.js.map +1 -0
- package/dist/payments.d.ts +12 -1
- package/dist/payments.js.map +1 -1
- package/docs/payments.md +54 -0
- package/package.json +10 -10
- package/src/administrator/integration-sources.ts +30 -1
- package/src/administrator/integrations.ts +2 -0
- package/src/administrator/payments.ts +28 -0
- package/src/administrator/tests/integration-sources-status.test.ts +121 -0
- package/src/authentication.ts +64 -0
- package/src/index.ts +20 -0
- package/src/mcp-auth.ts +293 -0
- package/src/payments.ts +12 -1
- package/test/mcp-auth.test.ts +255 -0
- package/test/payments.test.ts +65 -0
package/README.md
CHANGED
|
@@ -117,4 +117,85 @@ expired cookie-only sessions and the rotated cookie is written back to the
|
|
|
117
117
|
outbound response. Call it directly only when you need to refresh
|
|
118
118
|
proactively — e.g. before handing the session off to another service.
|
|
119
119
|
|
|
120
|
+
#### MCP client OAuth (Cursor, Claude, remote MCP)
|
|
121
|
+
|
|
122
|
+
External MCP clients use Qelos as an OAuth authorization server. The SDK
|
|
123
|
+
helpers build authorize URLs, parse callback query parameters, exchange
|
|
124
|
+
PKCE authorization codes, and wire login/consent pages in custom frontends —
|
|
125
|
+
without reimplementing URL construction or token requests.
|
|
126
|
+
|
|
127
|
+
Tenant admins must enable MCP OAuth and list client callback URLs in
|
|
128
|
+
`mcp-configuration.metadata.permittedCallbackUrls`.
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
import QelosSDK, {
|
|
132
|
+
appendMcpAccessDeniedRedirect,
|
|
133
|
+
buildMcpAuthorizePath,
|
|
134
|
+
buildMcpAuthorizePathFromQuery,
|
|
135
|
+
buildMcpConsentPageUrl,
|
|
136
|
+
buildMcpLoginRedirectUrl,
|
|
137
|
+
decodeMcpOAuthStatePayload,
|
|
138
|
+
parseMcpCallbackParams,
|
|
139
|
+
resolveMcpLoginRedirect,
|
|
140
|
+
} from '@qelos/sdk';
|
|
141
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
142
|
+
|
|
143
|
+
const sdk = new QelosSDK({ appUrl: 'https://your-tenant.qelos.app' });
|
|
144
|
+
|
|
145
|
+
// PKCE (required for authorization-code delivery to MCP clients)
|
|
146
|
+
const codeVerifier = randomBytes(32).toString('base64url');
|
|
147
|
+
const codeChallenge = createHash('sha256')
|
|
148
|
+
.update(codeVerifier)
|
|
149
|
+
.digest('base64url');
|
|
150
|
+
|
|
151
|
+
const redirectUri = 'cursor://anysphere.cursor-mcp/oauth/callback';
|
|
152
|
+
|
|
153
|
+
// 1) Send the user to Qelos authorize (browser or MCP client opens this URL)
|
|
154
|
+
const authorizeUrl = sdk.authentication.getMcpAuthorizeUrl({
|
|
155
|
+
redirectUri,
|
|
156
|
+
state: 'optional-csrf-state',
|
|
157
|
+
codeChallenge,
|
|
158
|
+
codeChallengeMethod: 'S256',
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// Relative path only (e.g. for login redirect resume):
|
|
162
|
+
const authorizePath = buildMcpAuthorizePath({
|
|
163
|
+
redirectUri,
|
|
164
|
+
codeChallenge,
|
|
165
|
+
codeChallengeMethod: 'S256',
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Custom login page: resume after sign-in (matches Qelos admin behavior)
|
|
169
|
+
const postLoginTarget = resolveMcpLoginRedirect(req.query);
|
|
170
|
+
// e.g. `/api/auth/mcp/authorize?redirect_uri=…` or `/mcp/authorize?mcp_state=…`
|
|
171
|
+
|
|
172
|
+
// Custom consent page: decode signed state for display (signature not verified)
|
|
173
|
+
const consent = decodeMcpOAuthStatePayload(req.query.mcp_state);
|
|
174
|
+
|
|
175
|
+
// 2) On your callback route, parse ?code=…&state=… (or ?error=…)
|
|
176
|
+
const params = parseMcpCallbackParams(req.url); // Express: req.url; Next.js: req.url
|
|
177
|
+
|
|
178
|
+
if (params.error) {
|
|
179
|
+
throw new Error(params.error);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// 3) Exchange the authorization code for OAuth tokens + user profile
|
|
183
|
+
const { accessToken, refreshToken, user } =
|
|
184
|
+
await sdk.authentication.exchangeMcpAuthorizationCode({
|
|
185
|
+
code: params.code!,
|
|
186
|
+
redirectUri,
|
|
187
|
+
codeVerifier,
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Apps using `@qelos/integrator-express` or `@qelos/integrator-next` with a
|
|
192
|
+
custom frontend should host `/login` and `/mcp/authorize` on the same domain
|
|
193
|
+
that proxies `/api/**` to Qelos. See
|
|
194
|
+
[Integrator MCP OAuth guide](https://docs.qelos.io/auth/mcp-oauth-integrators)
|
|
195
|
+
for the full flow.
|
|
196
|
+
|
|
197
|
+
Claude remote MCP uses `https://claude.ai/api/mcp/auth_callback` as
|
|
198
|
+
`redirectUri`; Cursor uses `cursor://anysphere.cursor-mcp/oauth/callback`.
|
|
199
|
+
Both must appear in the tenant permitted callback list.
|
|
200
|
+
|
|
120
201
|
Enjoy!
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { QelosSDKOptions, RequestExtra } from '../types';
|
|
2
2
|
import BaseSDK from '../base-sdk';
|
|
3
|
-
import { IIntegrationSource } from '@qelos/global-types';
|
|
3
|
+
import { IIntegrationSource, IIntegrationSourceStatusRequest, IIntegrationSourceStatusResult } from '@qelos/global-types';
|
|
4
4
|
export default class QlIntegrationSources extends BaseSDK {
|
|
5
5
|
private options;
|
|
6
6
|
private relativePath;
|
|
@@ -12,4 +12,6 @@ export default class QlIntegrationSources extends BaseSDK {
|
|
|
12
12
|
remove(sourceId: string): Promise<any>;
|
|
13
13
|
update(sourceId: string, changes: Partial<Pick<IIntegrationSource, 'name' | 'labels' | 'metadata' | 'authentication'>>): Promise<IIntegrationSource>;
|
|
14
14
|
create(source: Pick<IIntegrationSource, 'name' | 'labels' | 'metadata' | 'authentication'>): Promise<IIntegrationSource>;
|
|
15
|
+
checkStatus(sourceId: string, overrides?: Partial<Pick<IIntegrationSource, 'metadata' | 'authentication'>>): Promise<IIntegrationSourceStatusResult>;
|
|
16
|
+
checkDraftStatus(source: IIntegrationSourceStatusRequest): Promise<IIntegrationSourceStatusResult>;
|
|
15
17
|
}
|
|
@@ -29,5 +29,19 @@ export default class QlIntegrationSources extends BaseSDK {
|
|
|
29
29
|
body: JSON.stringify(source)
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
+
checkStatus(sourceId, overrides) {
|
|
33
|
+
return this.callJsonApi(`${this.relativePath}/${sourceId}/status`, {
|
|
34
|
+
method: 'post',
|
|
35
|
+
headers: { 'content-type': 'application/json' },
|
|
36
|
+
body: JSON.stringify(overrides ?? {}),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
checkDraftStatus(source) {
|
|
40
|
+
return this.callJsonApi(`${this.relativePath}/status`, {
|
|
41
|
+
method: 'post',
|
|
42
|
+
headers: { 'content-type': 'application/json' },
|
|
43
|
+
body: JSON.stringify(source),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
32
46
|
}
|
|
33
47
|
//# sourceMappingURL=integration-sources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration-sources.js","sourceRoot":"","sources":["../../src/administrator/integration-sources.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"integration-sources.js","sourceRoot":"","sources":["../../src/administrator/integration-sources.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,aAAa,CAAC;AAOlC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,OAAO;IAGnC;IAFZ,YAAY,GAAG,0BAA0B,CAAC;IAElD,YAAoB,OAAwB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAA;QADI,YAAO,GAAP,OAAO,CAAiB;IAE5C,CAAC;IAED,oBAAoB,CAAC,QAAgB,EAAE,KAAoB;QACzD,OAAO,IAAI,CAAC,WAAW,CAAqB,GAAG,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,CAAC,KAAyB,EAAE,KAAoB;QACrD,OAAO,IAAI,CAAC,WAAW,CAAuB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,CAAC,QAAgB;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,QAAgB,EAAE,OAA6F;QACpH,OAAO,IAAI,CAAC,WAAW,CACrB,GAAG,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE,EAClC;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CACF,CAAA;IACH,CAAC;IAED,MAAM,CAAC,MAAmF;QACxF,OAAO,IAAI,CAAC,WAAW,CAAqB,IAAI,CAAC,YAAY,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SAC7B,CAAC,CAAA;IACJ,CAAC;IAED,WAAW,CACT,QAAgB,EAChB,SAA4E;QAE5E,OAAO,IAAI,CAAC,WAAW,CACrB,GAAG,IAAI,CAAC,YAAY,IAAI,QAAQ,SAAS,EACzC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;SACtC,CACF,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,MAAuC;QACtD,OAAO,IAAI,CAAC,WAAW,CACrB,GAAG,IAAI,CAAC,YAAY,SAAS,EAC7B;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SAC7B,CACF,CAAC;IACJ,CAAC;CAEF"}
|
|
@@ -25,11 +25,13 @@ export default class QlIntegrations extends BaseSDK {
|
|
|
25
25
|
trigger?: any;
|
|
26
26
|
target?: any;
|
|
27
27
|
dataManipulation?: any;
|
|
28
|
+
targetManipulation?: any;
|
|
28
29
|
}): Promise<IIntegration>;
|
|
29
30
|
create(integration: {
|
|
30
31
|
trigger: any;
|
|
31
32
|
target: any;
|
|
32
33
|
dataManipulation?: any;
|
|
34
|
+
targetManipulation?: any;
|
|
33
35
|
active?: boolean;
|
|
34
36
|
}): Promise<IIntegration>;
|
|
35
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/administrator/integrations.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,aAAa,CAAC;AAGlC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IAG7B;IAFZ,YAAY,GAAG,mBAAmB,CAAC;IAE3C,YAAoB,OAAwB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAA;QADI,YAAO,GAAP,OAAO,CAAiB;IAE5C,CAAC;IAED,cAAc,CAAC,aAAqB,EAAE,KAAoB;QACxD,OAAO,IAAI,CAAC,WAAW,CAAe,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EAAE,KAAK,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,KAYP,EAAE,KAAoB;QACrB,OAAO,IAAI,CAAC,WAAW,CAAiB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,CAAC,aAAqB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,aAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/administrator/integrations.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,aAAa,CAAC;AAGlC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;IAG7B;IAFZ,YAAY,GAAG,mBAAmB,CAAC;IAE3C,YAAoB,OAAwB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAA;QADI,YAAO,GAAP,OAAO,CAAiB;IAE5C,CAAC;IAED,cAAc,CAAC,aAAqB,EAAE,KAAoB;QACxD,OAAO,IAAI,CAAC,WAAW,CAAe,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EAAE,KAAK,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,CAAC,KAYP,EAAE,KAAoB;QACrB,OAAO,IAAI,CAAC,WAAW,CAAiB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,CAAC,aAAqB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,aAAqB,EAAE,OAM7B;QACC,OAAO,IAAI,CAAC,WAAW,CACrB,GAAG,IAAI,CAAC,YAAY,IAAI,aAAa,EAAE,EACvC;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CACF,CAAA;IACH,CAAC;IAED,MAAM,CAAC,WAMN;QACC,OAAO,IAAI,CAAC,WAAW,CAAe,IAAI,CAAC,YAAY,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;SAClC,CAAC,CAAA;IACJ,CAAC;CAEF"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { QelosSDKOptions } from '../types';
|
|
2
2
|
import BaseSDK from '../base-sdk';
|
|
3
|
-
import { IPlan, ISubscription, IInvoice, ICoupon, BillableEntityType, SubscriptionStatus, InvoiceStatus, BillingCycle } from '@qelos/global-types';
|
|
3
|
+
import { IPlan, ISubscription, IInvoice, ICoupon, BillableEntityType, SubscriptionStatus, InvoiceStatus, BillingCycle, IPaymentsConfigurationMetadata, CheckoutCustomer } from '@qelos/global-types';
|
|
4
|
+
export interface PaymentsConfigurationRecord {
|
|
5
|
+
key: string;
|
|
6
|
+
metadata: IPaymentsConfigurationMetadata;
|
|
7
|
+
}
|
|
4
8
|
export interface AdminCheckoutRequest {
|
|
5
9
|
planId: string;
|
|
6
10
|
billingCycle: BillingCycle;
|
|
@@ -10,12 +14,20 @@ export interface AdminCheckoutRequest {
|
|
|
10
14
|
couponCode?: string;
|
|
11
15
|
successUrl?: string;
|
|
12
16
|
cancelUrl?: string;
|
|
17
|
+
/** When true, cancels any existing active/trialing subscription before checkout. */
|
|
18
|
+
reset?: boolean;
|
|
13
19
|
/**
|
|
14
20
|
* Admin-only. For plans with `dynamic: true`, sets the `dynamicAmount` on the
|
|
15
21
|
* pending subscription before initiating checkout. Regular users cannot set this;
|
|
16
22
|
* use `setSubscriptionDynamicAmount()` + a separate `checkout()` call instead.
|
|
17
23
|
*/
|
|
18
24
|
amount?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Real-world identity of the billable entity. Passed through to the payment
|
|
27
|
+
* provider (e.g. Sumit) so it can create a properly-named customer record
|
|
28
|
+
* instead of falling back to the raw billable entity ID.
|
|
29
|
+
*/
|
|
30
|
+
customer?: CheckoutCustomer;
|
|
19
31
|
}
|
|
20
32
|
export interface CreateSubscriptionData {
|
|
21
33
|
planId: string;
|
|
@@ -77,4 +89,8 @@ export default class QlPaymentsAdmin extends BaseSDK {
|
|
|
77
89
|
createCoupon(data: Omit<ICoupon, '_id' | 'tenant' | 'created' | 'currentRedemptions'>): Promise<ICoupon>;
|
|
78
90
|
updateCoupon(couponId: string, data: Partial<ICoupon>): Promise<ICoupon>;
|
|
79
91
|
deleteCoupon(couponId: string): Promise<ICoupon>;
|
|
92
|
+
/** Load tenant payments settings (`payments-configuration`). */
|
|
93
|
+
getPaymentsConfiguration(): Promise<PaymentsConfigurationRecord>;
|
|
94
|
+
/** Update tenant payments settings. Partial metadata is merged with the existing record. */
|
|
95
|
+
updatePaymentsConfiguration(metadata: Partial<IPaymentsConfigurationMetadata>): Promise<PaymentsConfigurationRecord>;
|
|
80
96
|
}
|
|
@@ -108,5 +108,17 @@ export default class QlPaymentsAdmin extends BaseSDK {
|
|
|
108
108
|
deleteCoupon(couponId) {
|
|
109
109
|
return this.callJsonApi(`/api/coupons/${couponId}`, { method: 'delete' });
|
|
110
110
|
}
|
|
111
|
+
/** Load tenant payments settings (`payments-configuration`). */
|
|
112
|
+
getPaymentsConfiguration() {
|
|
113
|
+
return this.callJsonApi('/api/payments/configuration');
|
|
114
|
+
}
|
|
115
|
+
/** Update tenant payments settings. Partial metadata is merged with the existing record. */
|
|
116
|
+
updatePaymentsConfiguration(metadata) {
|
|
117
|
+
return this.callJsonApi('/api/payments/configuration', {
|
|
118
|
+
method: 'put',
|
|
119
|
+
headers: { 'content-type': 'application/json' },
|
|
120
|
+
body: JSON.stringify({ metadata }),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
111
123
|
}
|
|
112
124
|
//# sourceMappingURL=payments.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/administrator/payments.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/administrator/payments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import * as assert from 'node:assert/strict';
|
|
2
|
+
import { test } from 'node:test';
|
|
3
|
+
import { IntegrationSourceKind } from '@qelos/global-types';
|
|
4
|
+
import QlIntegrationSources from '../integration-sources';
|
|
5
|
+
function jsonResponse(body) {
|
|
6
|
+
const res = new Response(JSON.stringify(body));
|
|
7
|
+
res.headers.set('Content-Type', 'application/json');
|
|
8
|
+
return res;
|
|
9
|
+
}
|
|
10
|
+
const connectedResult = {
|
|
11
|
+
status: 'connected',
|
|
12
|
+
message: 'Connection verified',
|
|
13
|
+
kind: IntegrationSourceKind.Sumit,
|
|
14
|
+
checkedAt: '2026-07-23T05:00:00.000Z',
|
|
15
|
+
};
|
|
16
|
+
test('QlIntegrationSources status methods', async (t) => {
|
|
17
|
+
await t.test('checkStatus sends POST to saved source status path', async () => {
|
|
18
|
+
let url = '';
|
|
19
|
+
let init;
|
|
20
|
+
const options = {
|
|
21
|
+
appUrl: 'http://localhost:3000',
|
|
22
|
+
fetch: async (requestUrl, requestInit) => {
|
|
23
|
+
url = requestUrl.toString();
|
|
24
|
+
init = requestInit;
|
|
25
|
+
return jsonResponse(connectedResult);
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const sdk = new QlIntegrationSources(options);
|
|
29
|
+
const result = await sdk.checkStatus('src-123');
|
|
30
|
+
assert.equal(url, 'http://localhost:3000/api/integration-sources/src-123/status');
|
|
31
|
+
assert.equal(init?.method, 'post');
|
|
32
|
+
assert.equal((init?.headers)['content-type'], 'application/json');
|
|
33
|
+
assert.deepEqual(JSON.parse(init?.body), {});
|
|
34
|
+
assert.deepEqual(result, connectedResult);
|
|
35
|
+
});
|
|
36
|
+
await t.test('checkStatus sends metadata and authentication overrides', async () => {
|
|
37
|
+
let init;
|
|
38
|
+
const options = {
|
|
39
|
+
appUrl: 'http://localhost:3000',
|
|
40
|
+
fetch: async (_url, requestInit) => {
|
|
41
|
+
init = requestInit;
|
|
42
|
+
return jsonResponse(connectedResult);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
const sdk = new QlIntegrationSources(options);
|
|
46
|
+
await sdk.checkStatus('src-123', {
|
|
47
|
+
metadata: { companyId: '42' },
|
|
48
|
+
authentication: { apiKey: 'secret' },
|
|
49
|
+
});
|
|
50
|
+
assert.deepEqual(JSON.parse(init?.body), {
|
|
51
|
+
metadata: { companyId: '42' },
|
|
52
|
+
authentication: { apiKey: 'secret' },
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
await t.test('checkDraftStatus sends POST to draft status path', async () => {
|
|
56
|
+
let url = '';
|
|
57
|
+
let init;
|
|
58
|
+
const options = {
|
|
59
|
+
appUrl: 'http://localhost:3000',
|
|
60
|
+
fetch: async (requestUrl, requestInit) => {
|
|
61
|
+
url = requestUrl.toString();
|
|
62
|
+
init = requestInit;
|
|
63
|
+
return jsonResponse(connectedResult);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
const draft = {
|
|
67
|
+
kind: IntegrationSourceKind.PayPal,
|
|
68
|
+
metadata: { environment: 'sandbox' },
|
|
69
|
+
authentication: { clientId: 'id', clientSecret: 'secret' },
|
|
70
|
+
};
|
|
71
|
+
const sdk = new QlIntegrationSources(options);
|
|
72
|
+
const result = await sdk.checkDraftStatus(draft);
|
|
73
|
+
assert.equal(url, 'http://localhost:3000/api/integration-sources/status');
|
|
74
|
+
assert.equal(init?.method, 'post');
|
|
75
|
+
assert.equal((init?.headers)['content-type'], 'application/json');
|
|
76
|
+
assert.deepEqual(JSON.parse(init?.body), draft);
|
|
77
|
+
assert.deepEqual(result, connectedResult);
|
|
78
|
+
});
|
|
79
|
+
await t.test('checkDraftStatus is kind-agnostic and works for non-payment sources too', async () => {
|
|
80
|
+
let init;
|
|
81
|
+
const emailConnectedResult = {
|
|
82
|
+
status: 'connected',
|
|
83
|
+
message: 'SMTP connection verified',
|
|
84
|
+
kind: IntegrationSourceKind.Email,
|
|
85
|
+
checkedAt: '2026-07-23T05:00:00.000Z',
|
|
86
|
+
};
|
|
87
|
+
const options = {
|
|
88
|
+
appUrl: 'http://localhost:3000',
|
|
89
|
+
fetch: async (_url, requestInit) => {
|
|
90
|
+
init = requestInit;
|
|
91
|
+
return jsonResponse(emailConnectedResult);
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
const draft = {
|
|
95
|
+
kind: IntegrationSourceKind.Email,
|
|
96
|
+
metadata: { smtp: 'smtp.example.com', username: 'bot@example.com', email: 'bot@example.com', pop3: 'pop3.example.com', senderName: 'Bot' },
|
|
97
|
+
authentication: { password: 'secret' },
|
|
98
|
+
};
|
|
99
|
+
const sdk = new QlIntegrationSources(options);
|
|
100
|
+
const result = await sdk.checkDraftStatus(draft);
|
|
101
|
+
assert.deepEqual(JSON.parse(init?.body), draft);
|
|
102
|
+
assert.deepEqual(result, emailConnectedResult);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=integration-sources-status.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-sources-status.test.js","sourceRoot":"","sources":["../../../src/administrator/tests/integration-sources-status.test.ts"],"names":[],"mappings":"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"}
|
package/dist/authentication.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { QelosSDKOptions } from './types';
|
|
2
2
|
import BaseSDK from './base-sdk';
|
|
3
|
+
import { type McpAuthorizeOptions, type McpTokenExchangeOptions, type McpTokenExchangeResult } from './mcp-auth';
|
|
4
|
+
export type { McpAuthorizeOptions, McpCallbackInput, McpCallbackParams, McpTokenExchangeOptions, McpTokenExchangeResult, DecodedMcpOAuthStatePayload, McpPagePathOptions, } from './mcp-auth';
|
|
5
|
+
export { parseMcpCallbackParams } from './mcp-auth';
|
|
3
6
|
export interface IUser {
|
|
4
7
|
_id: string;
|
|
5
8
|
username: string;
|
|
@@ -158,6 +161,8 @@ export default class QlAuthentication extends BaseSDK {
|
|
|
158
161
|
* callback with `?rt=` (refresh token) after OAuth.
|
|
159
162
|
*/
|
|
160
163
|
socialCallback(input: SocialCallbackInput): Promise<SocialAuthCallbackPayload>;
|
|
164
|
+
getMcpAuthorizeUrl(options: McpAuthorizeOptions): string;
|
|
165
|
+
exchangeMcpAuthorizationCode(options: McpTokenExchangeOptions): Promise<McpTokenExchangeResult>;
|
|
161
166
|
getLoggedInUser(): Promise<IUser>;
|
|
162
167
|
updateLoggedInUser(changes: Partial<IUser & {
|
|
163
168
|
password?: string;
|
package/dist/authentication.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import BaseSDK from './base-sdk';
|
|
2
2
|
import { decodeMeUser } from './services/decode-uri-fields';
|
|
3
|
+
import { buildMcpAuthorizePath, buildMcpTokenExchangeBody, } from './mcp-auth';
|
|
4
|
+
export { parseMcpCallbackParams } from './mcp-auth';
|
|
3
5
|
function collectSetCookieHeaders(res) {
|
|
4
6
|
const h = res.headers;
|
|
5
7
|
if (typeof h.getSetCookie === 'function') {
|
|
@@ -251,6 +253,43 @@ export default class QlAuthentication extends BaseSDK {
|
|
|
251
253
|
}
|
|
252
254
|
return this.exchangeAuthCallback(refreshToken);
|
|
253
255
|
}
|
|
256
|
+
getMcpAuthorizeUrl(options) {
|
|
257
|
+
if (!options.redirectUri) {
|
|
258
|
+
throw new Error('redirectUri is required');
|
|
259
|
+
}
|
|
260
|
+
return this.buildUrl(buildMcpAuthorizePath(options));
|
|
261
|
+
}
|
|
262
|
+
async exchangeMcpAuthorizationCode(options) {
|
|
263
|
+
const { code, redirectUri, codeVerifier } = options;
|
|
264
|
+
if (!code || !redirectUri || !codeVerifier) {
|
|
265
|
+
throw new Error('code, redirectUri, and codeVerifier are required');
|
|
266
|
+
}
|
|
267
|
+
const res = await this.callApi('/api/auth/mcp/token', {
|
|
268
|
+
method: 'post',
|
|
269
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
270
|
+
body: buildMcpTokenExchangeBody(options).toString(),
|
|
271
|
+
});
|
|
272
|
+
if (!res.ok) {
|
|
273
|
+
let detail = '';
|
|
274
|
+
try {
|
|
275
|
+
detail = (await res.text()).slice(0, 512);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
/* ignore */
|
|
279
|
+
}
|
|
280
|
+
throw new Error(`failed to exchange MCP authorization code: HTTP ${res.status}${detail ? ` — ${detail}` : ''}`);
|
|
281
|
+
}
|
|
282
|
+
const body = (await res.json());
|
|
283
|
+
this.#accessToken = body.access_token;
|
|
284
|
+
this.#refreshToken = body.refresh_token;
|
|
285
|
+
const user = await this.getLoggedInUser();
|
|
286
|
+
return {
|
|
287
|
+
accessToken: body.access_token,
|
|
288
|
+
refreshToken: body.refresh_token,
|
|
289
|
+
expiresIn: body.expires_in,
|
|
290
|
+
user,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
254
293
|
getLoggedInUser() {
|
|
255
294
|
return this.callJsonApi('/api/me').then(decodeMeUser);
|
|
256
295
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../src/authentication.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"authentication.js","sourceRoot":"","sources":["../src/authentication.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,9 +10,10 @@ import QlBlueprintEntities from './blueprints-entities';
|
|
|
10
10
|
import QlAI from './ai';
|
|
11
11
|
import QlLambdas from './lambdas';
|
|
12
12
|
import QlPayments from './payments';
|
|
13
|
-
export type { SocialCallbackInput, SocialAuthCallbackPayload, SocialProvider, SocialLoginOptions, } from './authentication';
|
|
13
|
+
export type { SocialCallbackInput, SocialAuthCallbackPayload, SocialProvider, SocialLoginOptions, McpAuthorizeOptions, McpCallbackInput, McpCallbackParams, McpTokenExchangeOptions, McpTokenExchangeResult, DecodedMcpOAuthStatePayload, McpPagePathOptions, } from './authentication';
|
|
14
14
|
export type { BlueprintEntitiesRegistry } from './blueprints';
|
|
15
|
-
export { parseSocialCallbackRefreshToken, getSocialAuthSetCookieParts, applySocialAuthCookiesToServerResponse, } from './authentication';
|
|
15
|
+
export { parseSocialCallbackRefreshToken, getSocialAuthSetCookieParts, applySocialAuthCookiesToServerResponse, parseMcpCallbackParams, } from './authentication';
|
|
16
|
+
export { buildMcpAuthorizePath, buildMcpAuthorizePathFromQuery, buildMcpLoginRedirectUrl, buildMcpConsentPageUrl, resolveMcpLoginRedirect, appendMcpAccessDeniedRedirect, decodeMcpOAuthStatePayload, buildMcpTokenExchangeBody, } from './mcp-auth';
|
|
16
17
|
export default class QelosSDK extends BaseSDK {
|
|
17
18
|
#private;
|
|
18
19
|
private options;
|
package/dist/index.js
CHANGED
|
@@ -13,8 +13,10 @@ const noExtraHeadersUrls = new Set([
|
|
|
13
13
|
'/api/signin',
|
|
14
14
|
'/api/signup',
|
|
15
15
|
'/api/auth/callback',
|
|
16
|
+
'/api/auth/mcp/token',
|
|
16
17
|
]);
|
|
17
|
-
export { parseSocialCallbackRefreshToken, getSocialAuthSetCookieParts, applySocialAuthCookiesToServerResponse, } from './authentication';
|
|
18
|
+
export { parseSocialCallbackRefreshToken, getSocialAuthSetCookieParts, applySocialAuthCookiesToServerResponse, parseMcpCallbackParams, } from './authentication';
|
|
19
|
+
export { buildMcpAuthorizePath, buildMcpAuthorizePathFromQuery, buildMcpLoginRedirectUrl, buildMcpConsentPageUrl, resolveMcpLoginRedirect, appendMcpAccessDeniedRedirect, decodeMcpOAuthStatePayload, buildMcpTokenExchangeBody, } from './mcp-auth';
|
|
18
20
|
export default class QelosSDK extends BaseSDK {
|
|
19
21
|
options;
|
|
20
22
|
#customHeaders = {};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AACnD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,gBAAgB,MAAM,kBAAkB,CAAC;AAChD,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,YAAY,MAAM,cAAc,CAAC;AAExC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,oBAAoB;IACpB,aAAa;IACb,aAAa;IACb,oBAAoB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { IUser } from './authentication';
|
|
2
|
+
export interface McpAuthorizeOptions {
|
|
3
|
+
redirectUri: string;
|
|
4
|
+
state?: string;
|
|
5
|
+
codeChallenge?: string;
|
|
6
|
+
codeChallengeMethod?: string;
|
|
7
|
+
clientId?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface McpTokenExchangeOptions {
|
|
10
|
+
code: string;
|
|
11
|
+
redirectUri: string;
|
|
12
|
+
codeVerifier: string;
|
|
13
|
+
}
|
|
14
|
+
export interface McpTokenExchangeResult {
|
|
15
|
+
accessToken: string;
|
|
16
|
+
refreshToken: string;
|
|
17
|
+
expiresIn: number;
|
|
18
|
+
user: IUser;
|
|
19
|
+
}
|
|
20
|
+
/** Callback URL or query bag from an MCP OAuth redirect. */
|
|
21
|
+
export type McpCallbackInput = string | URL | URLSearchParams | Record<string, string | string[] | undefined>;
|
|
22
|
+
export interface McpCallbackParams {
|
|
23
|
+
code?: string;
|
|
24
|
+
state?: string;
|
|
25
|
+
error?: string;
|
|
26
|
+
errorDescription?: string;
|
|
27
|
+
}
|
|
28
|
+
/** Decoded MCP OAuth state JWT payload (display only — not verified). */
|
|
29
|
+
export interface DecodedMcpOAuthStatePayload {
|
|
30
|
+
redirectUri?: string;
|
|
31
|
+
state?: string;
|
|
32
|
+
codeChallenge?: string;
|
|
33
|
+
codeChallengeMethod?: string;
|
|
34
|
+
tenant?: string;
|
|
35
|
+
clientId?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface McpPagePathOptions {
|
|
38
|
+
loginPath?: string;
|
|
39
|
+
consentPath?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse authorization callback parameters from an MCP OAuth redirect.
|
|
43
|
+
* Accepts a full URL, {@link URL}, `URLSearchParams`, a query/fragment string,
|
|
44
|
+
* or a query object such as `req.query` from Next.js or Express.
|
|
45
|
+
*/
|
|
46
|
+
export declare function parseMcpCallbackParams(input: McpCallbackInput): McpCallbackParams;
|
|
47
|
+
/** Relative authorize path with query string for {@link QlAuthentication.getMcpAuthorizeUrl}. */
|
|
48
|
+
export declare function buildMcpAuthorizePath(options: McpAuthorizeOptions): string;
|
|
49
|
+
/**
|
|
50
|
+
* Build `/api/auth/mcp/authorize?…` from OAuth authorize query params
|
|
51
|
+
* (e.g. when `/mcp/authorize` receives a direct client redirect).
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildMcpAuthorizePathFromQuery(query: Record<string, string | string[] | undefined>): string | null;
|
|
54
|
+
/** Login redirect used by Qelos after an unauthenticated MCP authorize request. */
|
|
55
|
+
export declare function buildMcpLoginRedirectUrl(authorizePath: string, options?: Pick<McpPagePathOptions, 'loginPath'>): string;
|
|
56
|
+
/** Consent page URL issued after the user signs in during MCP OAuth. */
|
|
57
|
+
export declare function buildMcpConsentPageUrl(mcpState: string, options?: Pick<McpPagePathOptions, 'consentPath'>): string;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve the post-login redirect target from login-page query params.
|
|
60
|
+
* Matches the resume logic used by the Qelos admin login flow.
|
|
61
|
+
*/
|
|
62
|
+
export declare function resolveMcpLoginRedirect(query: Record<string, string | string[] | undefined>, options?: McpPagePathOptions): string | null;
|
|
63
|
+
/** Redirect URI with `error=access_denied` for MCP consent denial. */
|
|
64
|
+
export declare function appendMcpAccessDeniedRedirect(redirectUri: string, oauthState?: string | null): string;
|
|
65
|
+
/**
|
|
66
|
+
* Decode the signed `mcp_state` JWT payload for display on a consent page.
|
|
67
|
+
* Does not verify the signature — use only for UI labels, not authorization.
|
|
68
|
+
*/
|
|
69
|
+
export declare function decodeMcpOAuthStatePayload(mcpState: string): DecodedMcpOAuthStatePayload | null;
|
|
70
|
+
export interface McpOAuthTokenResponse {
|
|
71
|
+
access_token: string;
|
|
72
|
+
refresh_token: string;
|
|
73
|
+
token_type: string;
|
|
74
|
+
expires_in: number;
|
|
75
|
+
}
|
|
76
|
+
export declare function buildMcpTokenExchangeBody(options: McpTokenExchangeOptions): URLSearchParams;
|