@marktoflow/core 2.0.0-alpha.9 → 2.0.2
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 +24 -222
- package/dist/built-in-operations.d.ts +150 -0
- package/dist/built-in-operations.d.ts.map +1 -0
- package/dist/built-in-operations.js +799 -0
- package/dist/built-in-operations.js.map +1 -0
- package/dist/core-tools.d.ts +39 -0
- package/dist/core-tools.d.ts.map +1 -0
- package/dist/core-tools.js +58 -0
- package/dist/core-tools.js.map +1 -0
- package/dist/credentials.d.ts +60 -1
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +229 -4
- package/dist/credentials.js.map +1 -1
- package/dist/engine.d.ts +92 -3
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +937 -59
- package/dist/engine.js.map +1 -1
- package/dist/file-operations.d.ts +86 -0
- package/dist/file-operations.d.ts.map +1 -0
- package/dist/file-operations.js +382 -0
- package/dist/file-operations.js.map +1 -0
- package/dist/index.d.ts +16 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/logging.d.ts +40 -2
- package/dist/logging.d.ts.map +1 -1
- package/dist/logging.js +166 -13
- package/dist/logging.js.map +1 -1
- package/dist/models.d.ts +1441 -54
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +124 -2
- package/dist/models.js.map +1 -1
- package/dist/nunjucks-filters.d.ts +271 -0
- package/dist/nunjucks-filters.d.ts.map +1 -0
- package/dist/nunjucks-filters.js +648 -0
- package/dist/nunjucks-filters.js.map +1 -0
- package/dist/oauth-manager.d.ts +128 -0
- package/dist/oauth-manager.d.ts.map +1 -0
- package/dist/oauth-manager.js +291 -0
- package/dist/oauth-manager.js.map +1 -0
- package/dist/oauth-refresh.d.ts +37 -0
- package/dist/oauth-refresh.d.ts.map +1 -0
- package/dist/oauth-refresh.js +76 -0
- package/dist/oauth-refresh.js.map +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +113 -3
- package/dist/parser.js.map +1 -1
- package/dist/permissions.d.ts +49 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +286 -0
- package/dist/permissions.js.map +1 -0
- package/dist/prompt-loader.d.ts +53 -0
- package/dist/prompt-loader.d.ts.map +1 -0
- package/dist/prompt-loader.js +205 -0
- package/dist/prompt-loader.js.map +1 -0
- package/dist/scheduler.d.ts +22 -3
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +72 -73
- package/dist/scheduler.js.map +1 -1
- package/dist/script-executor.d.ts +65 -0
- package/dist/script-executor.d.ts.map +1 -0
- package/dist/script-executor.js +261 -0
- package/dist/script-executor.js.map +1 -0
- package/dist/sdk-registry.d.ts +20 -2
- package/dist/sdk-registry.d.ts.map +1 -1
- package/dist/sdk-registry.js +100 -15
- package/dist/sdk-registry.js.map +1 -1
- package/dist/secret-providers/index.d.ts +12 -0
- package/dist/secret-providers/index.d.ts.map +1 -0
- package/dist/secret-providers/index.js +11 -0
- package/dist/secret-providers/index.js.map +1 -0
- package/dist/secret-providers/providers/aws.d.ts +32 -0
- package/dist/secret-providers/providers/aws.d.ts.map +1 -0
- package/dist/secret-providers/providers/aws.js +118 -0
- package/dist/secret-providers/providers/aws.js.map +1 -0
- package/dist/secret-providers/providers/azure.d.ts +40 -0
- package/dist/secret-providers/providers/azure.d.ts.map +1 -0
- package/dist/secret-providers/providers/azure.js +170 -0
- package/dist/secret-providers/providers/azure.js.map +1 -0
- package/dist/secret-providers/providers/env.d.ts +26 -0
- package/dist/secret-providers/providers/env.d.ts.map +1 -0
- package/dist/secret-providers/providers/env.js +59 -0
- package/dist/secret-providers/providers/env.js.map +1 -0
- package/dist/secret-providers/providers/vault.d.ts +39 -0
- package/dist/secret-providers/providers/vault.d.ts.map +1 -0
- package/dist/secret-providers/providers/vault.js +180 -0
- package/dist/secret-providers/providers/vault.js.map +1 -0
- package/dist/secret-providers/secret-manager.d.ts +72 -0
- package/dist/secret-providers/secret-manager.d.ts.map +1 -0
- package/dist/secret-providers/secret-manager.js +226 -0
- package/dist/secret-providers/secret-manager.js.map +1 -0
- package/dist/secret-providers/types.d.ts +105 -0
- package/dist/secret-providers/types.d.ts.map +1 -0
- package/dist/secret-providers/types.js +8 -0
- package/dist/secret-providers/types.js.map +1 -0
- package/dist/secrets/index.d.ts +12 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +11 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/providers/aws.d.ts +32 -0
- package/dist/secrets/providers/aws.d.ts.map +1 -0
- package/dist/secrets/providers/aws.js +118 -0
- package/dist/secrets/providers/aws.js.map +1 -0
- package/dist/secrets/providers/azure.d.ts +40 -0
- package/dist/secrets/providers/azure.d.ts.map +1 -0
- package/dist/secrets/providers/azure.js +170 -0
- package/dist/secrets/providers/azure.js.map +1 -0
- package/dist/secrets/providers/env.d.ts +26 -0
- package/dist/secrets/providers/env.d.ts.map +1 -0
- package/dist/secrets/providers/env.js +59 -0
- package/dist/secrets/providers/env.js.map +1 -0
- package/dist/secrets/providers/vault.d.ts +39 -0
- package/dist/secrets/providers/vault.d.ts.map +1 -0
- package/dist/secrets/providers/vault.js +180 -0
- package/dist/secrets/providers/vault.js.map +1 -0
- package/dist/secrets/secret-manager.d.ts +72 -0
- package/dist/secrets/secret-manager.d.ts.map +1 -0
- package/dist/secrets/secret-manager.js +226 -0
- package/dist/secrets/secret-manager.js.map +1 -0
- package/dist/secrets/types.d.ts +105 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +8 -0
- package/dist/secrets/types.js.map +1 -0
- package/dist/security.d.ts +1 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +4 -0
- package/dist/security.js.map +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +16 -9
- package/dist/state.js.map +1 -1
- package/dist/template-engine.d.ts +51 -0
- package/dist/template-engine.d.ts.map +1 -0
- package/dist/template-engine.js +227 -0
- package/dist/template-engine.js.map +1 -0
- package/dist/templates.d.ts +10 -0
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +21 -17
- package/dist/templates.js.map +1 -1
- package/dist/tools/mcp-tool.js +9 -9
- package/dist/tools/mcp-tool.js.map +1 -1
- package/dist/trigger-manager.js +1 -1
- package/dist/trigger-manager.js.map +1 -1
- package/dist/workflow-tools.d.ts +102 -0
- package/dist/workflow-tools.d.ts.map +1 -0
- package/dist/workflow-tools.js +130 -0
- package/dist/workflow-tools.js.map +1 -0
- package/package.json +31 -13
- package/LICENSE +0 -201
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Token Manager for marktoflow.
|
|
3
|
+
*
|
|
4
|
+
* Manages OAuth2 token lifecycle:
|
|
5
|
+
* - Stores token expiry alongside credentials
|
|
6
|
+
* - Intercepts 401 responses and refreshes tokens automatically
|
|
7
|
+
* - Saves refreshed tokens back to the credential store
|
|
8
|
+
* - Emits events for token refresh (for audit logging)
|
|
9
|
+
*
|
|
10
|
+
* Supports Google OAuth2, Microsoft (MSAL), and generic OAuth2 refresh flows.
|
|
11
|
+
*/
|
|
12
|
+
import { EventEmitter } from 'node:events';
|
|
13
|
+
import type { CredentialManager } from './credentials.js';
|
|
14
|
+
/** Configuration for a service's OAuth2 refresh flow. */
|
|
15
|
+
export interface OAuthServiceConfig {
|
|
16
|
+
clientId: string;
|
|
17
|
+
clientSecret: string;
|
|
18
|
+
refreshToken: string;
|
|
19
|
+
tokenEndpoint: string;
|
|
20
|
+
/** Additional parameters to include in the refresh request body. */
|
|
21
|
+
extraParams?: Record<string, string> | undefined;
|
|
22
|
+
/** Scope to request when refreshing (some providers require it). */
|
|
23
|
+
scope?: string | undefined;
|
|
24
|
+
}
|
|
25
|
+
/** Token data as stored/returned by the manager. */
|
|
26
|
+
export interface OAuthTokenData {
|
|
27
|
+
accessToken: string;
|
|
28
|
+
refreshToken: string;
|
|
29
|
+
expiresAt: number;
|
|
30
|
+
tokenType?: string | undefined;
|
|
31
|
+
scope?: string | undefined;
|
|
32
|
+
}
|
|
33
|
+
/** Events emitted by OAuthTokenManager. */
|
|
34
|
+
export interface OAuthTokenManagerEvents {
|
|
35
|
+
token_refreshed: [serviceName: string, tokenData: OAuthTokenData];
|
|
36
|
+
token_refresh_failed: [serviceName: string, error: Error];
|
|
37
|
+
}
|
|
38
|
+
export declare class OAuthTokenManager extends EventEmitter {
|
|
39
|
+
private serviceConfigs;
|
|
40
|
+
private credentialManager;
|
|
41
|
+
/** Track in-flight refresh promises to avoid concurrent refreshes for the same service. */
|
|
42
|
+
private refreshLocks;
|
|
43
|
+
constructor(credentialManager: CredentialManager);
|
|
44
|
+
emit<K extends keyof OAuthTokenManagerEvents>(event: K, ...args: OAuthTokenManagerEvents[K]): boolean;
|
|
45
|
+
on<K extends keyof OAuthTokenManagerEvents>(event: K, listener: (...args: OAuthTokenManagerEvents[K]) => void): this;
|
|
46
|
+
once<K extends keyof OAuthTokenManagerEvents>(event: K, listener: (...args: OAuthTokenManagerEvents[K]) => void): this;
|
|
47
|
+
/**
|
|
48
|
+
* Register OAuth2 configuration for a service.
|
|
49
|
+
*/
|
|
50
|
+
registerService(serviceName: string, config: OAuthServiceConfig): void;
|
|
51
|
+
/**
|
|
52
|
+
* Register a Google OAuth2 service using standard Google token endpoint.
|
|
53
|
+
*/
|
|
54
|
+
registerGoogleService(serviceName: string, config: Omit<OAuthServiceConfig, 'tokenEndpoint'>): void;
|
|
55
|
+
/**
|
|
56
|
+
* Register a Microsoft (MSAL) OAuth2 service.
|
|
57
|
+
* Optionally provide a tenant ID; defaults to "common".
|
|
58
|
+
*/
|
|
59
|
+
registerMicrosoftService(serviceName: string, config: Omit<OAuthServiceConfig, 'tokenEndpoint'> & {
|
|
60
|
+
tenantId?: string | undefined;
|
|
61
|
+
}): void;
|
|
62
|
+
/**
|
|
63
|
+
* Remove a registered service configuration.
|
|
64
|
+
*/
|
|
65
|
+
unregisterService(serviceName: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Get the configuration for a registered service.
|
|
68
|
+
*/
|
|
69
|
+
getServiceConfig(serviceName: string): OAuthServiceConfig | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* List all registered service names.
|
|
72
|
+
*/
|
|
73
|
+
listServices(): string[];
|
|
74
|
+
/**
|
|
75
|
+
* Save token data for a service into the credential store.
|
|
76
|
+
*/
|
|
77
|
+
saveToken(serviceName: string, tokenData: OAuthTokenData): void;
|
|
78
|
+
/**
|
|
79
|
+
* Load token data for a service from the credential store.
|
|
80
|
+
* Returns null if not found.
|
|
81
|
+
*/
|
|
82
|
+
loadToken(serviceName: string): OAuthTokenData | null;
|
|
83
|
+
/**
|
|
84
|
+
* Check whether the token is expired (or close to expiry) and refresh if needed.
|
|
85
|
+
* Returns the current token data if still valid, or a refreshed token.
|
|
86
|
+
*/
|
|
87
|
+
refreshIfNeeded(serviceName: string, tokenData: OAuthTokenData): Promise<OAuthTokenData>;
|
|
88
|
+
/**
|
|
89
|
+
* Handle an authentication error (e.g., 401 response).
|
|
90
|
+
* If the error looks like a 401/auth error, attempt a token refresh.
|
|
91
|
+
* Returns refreshed token data on success, or re-throws on failure.
|
|
92
|
+
*/
|
|
93
|
+
handleAuthError(serviceName: string, tokenData: OAuthTokenData, error: unknown): Promise<OAuthTokenData>;
|
|
94
|
+
/**
|
|
95
|
+
* Force a token refresh regardless of expiry status.
|
|
96
|
+
*/
|
|
97
|
+
forceRefresh(serviceName: string, tokenData: OAuthTokenData): Promise<OAuthTokenData>;
|
|
98
|
+
/**
|
|
99
|
+
* Check whether a token is expired or will expire within the buffer window.
|
|
100
|
+
*/
|
|
101
|
+
isExpiredOrExpiring(tokenData: OAuthTokenData): boolean;
|
|
102
|
+
private credentialName;
|
|
103
|
+
/**
|
|
104
|
+
* Determine if an error represents an HTTP 401 / auth failure.
|
|
105
|
+
*/
|
|
106
|
+
private isAuthError;
|
|
107
|
+
/**
|
|
108
|
+
* Perform the actual token refresh. Uses a lock to prevent concurrent
|
|
109
|
+
* refreshes for the same service.
|
|
110
|
+
*/
|
|
111
|
+
private doRefresh;
|
|
112
|
+
/**
|
|
113
|
+
* Execute the HTTP call to the token endpoint.
|
|
114
|
+
*/
|
|
115
|
+
private executeRefresh;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create an OAuthTokenManager wired to the given CredentialManager.
|
|
119
|
+
*/
|
|
120
|
+
export declare function createOAuthTokenManager(credentialManager: CredentialManager): OAuthTokenManager;
|
|
121
|
+
/**
|
|
122
|
+
* Well-known token endpoints for convenience.
|
|
123
|
+
*/
|
|
124
|
+
export declare const TOKEN_ENDPOINTS: {
|
|
125
|
+
readonly google: "https://oauth2.googleapis.com/token";
|
|
126
|
+
readonly microsoft: "https://login.microsoftonline.com/common/oauth2/v2.0/token";
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=oauth-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-manager.d.ts","sourceRoot":"","sources":["../src/oauth-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Token Manager for marktoflow.
|
|
3
|
+
*
|
|
4
|
+
* Manages OAuth2 token lifecycle:
|
|
5
|
+
* - Stores token expiry alongside credentials
|
|
6
|
+
* - Intercepts 401 responses and refreshes tokens automatically
|
|
7
|
+
* - Saves refreshed tokens back to the credential store
|
|
8
|
+
* - Emits events for token refresh (for audit logging)
|
|
9
|
+
*
|
|
10
|
+
* Supports Google OAuth2, Microsoft (MSAL), and generic OAuth2 refresh flows.
|
|
11
|
+
*/
|
|
12
|
+
import { EventEmitter } from 'node:events';
|
|
13
|
+
import { CredentialType } from './credentials.js';
|
|
14
|
+
// ── Well-known token endpoints ──────────────────────────────────────────────
|
|
15
|
+
const GOOGLE_TOKEN_ENDPOINT = 'https://oauth2.googleapis.com/token';
|
|
16
|
+
const MICROSOFT_TOKEN_ENDPOINT = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
|
|
17
|
+
// ── Pre-expiry buffer (refresh 5 minutes before actual expiry) ──────────────
|
|
18
|
+
const TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000;
|
|
19
|
+
// ── OAuthTokenManager ───────────────────────────────────────────────────────
|
|
20
|
+
export class OAuthTokenManager extends EventEmitter {
|
|
21
|
+
serviceConfigs = new Map();
|
|
22
|
+
credentialManager;
|
|
23
|
+
/** Track in-flight refresh promises to avoid concurrent refreshes for the same service. */
|
|
24
|
+
refreshLocks = new Map();
|
|
25
|
+
constructor(credentialManager) {
|
|
26
|
+
super();
|
|
27
|
+
this.credentialManager = credentialManager;
|
|
28
|
+
}
|
|
29
|
+
// ── typed emit / on helpers ─────────────────────────────────────────────
|
|
30
|
+
emit(event, ...args) {
|
|
31
|
+
return super.emit(event, ...args);
|
|
32
|
+
}
|
|
33
|
+
on(event, listener) {
|
|
34
|
+
return super.on(event, listener);
|
|
35
|
+
}
|
|
36
|
+
once(event, listener) {
|
|
37
|
+
return super.once(event, listener);
|
|
38
|
+
}
|
|
39
|
+
// ── Configuration ───────────────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Register OAuth2 configuration for a service.
|
|
42
|
+
*/
|
|
43
|
+
registerService(serviceName, config) {
|
|
44
|
+
this.serviceConfigs.set(serviceName, config);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Register a Google OAuth2 service using standard Google token endpoint.
|
|
48
|
+
*/
|
|
49
|
+
registerGoogleService(serviceName, config) {
|
|
50
|
+
this.registerService(serviceName, {
|
|
51
|
+
...config,
|
|
52
|
+
tokenEndpoint: GOOGLE_TOKEN_ENDPOINT,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Register a Microsoft (MSAL) OAuth2 service.
|
|
57
|
+
* Optionally provide a tenant ID; defaults to "common".
|
|
58
|
+
*/
|
|
59
|
+
registerMicrosoftService(serviceName, config) {
|
|
60
|
+
const tenant = config.tenantId ?? 'common';
|
|
61
|
+
const endpoint = `https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token`;
|
|
62
|
+
const { tenantId: _unused, ...rest } = config;
|
|
63
|
+
this.registerService(serviceName, {
|
|
64
|
+
...rest,
|
|
65
|
+
tokenEndpoint: endpoint,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Remove a registered service configuration.
|
|
70
|
+
*/
|
|
71
|
+
unregisterService(serviceName) {
|
|
72
|
+
return this.serviceConfigs.delete(serviceName);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get the configuration for a registered service.
|
|
76
|
+
*/
|
|
77
|
+
getServiceConfig(serviceName) {
|
|
78
|
+
return this.serviceConfigs.get(serviceName);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* List all registered service names.
|
|
82
|
+
*/
|
|
83
|
+
listServices() {
|
|
84
|
+
return Array.from(this.serviceConfigs.keys());
|
|
85
|
+
}
|
|
86
|
+
// ── Token persistence helpers ───────────────────────────────────────────
|
|
87
|
+
/**
|
|
88
|
+
* Save token data for a service into the credential store.
|
|
89
|
+
*/
|
|
90
|
+
saveToken(serviceName, tokenData) {
|
|
91
|
+
const credName = this.credentialName(serviceName);
|
|
92
|
+
this.credentialManager.set({
|
|
93
|
+
name: credName,
|
|
94
|
+
value: JSON.stringify(tokenData),
|
|
95
|
+
credentialType: CredentialType.OAUTH_TOKEN,
|
|
96
|
+
description: `OAuth2 token for ${serviceName}`,
|
|
97
|
+
metadata: {
|
|
98
|
+
serviceName,
|
|
99
|
+
expiresAt: tokenData.expiresAt,
|
|
100
|
+
tokenType: tokenData.tokenType ?? 'Bearer',
|
|
101
|
+
},
|
|
102
|
+
expiresAt: new Date(tokenData.expiresAt),
|
|
103
|
+
tags: ['oauth', serviceName],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Load token data for a service from the credential store.
|
|
108
|
+
* Returns null if not found.
|
|
109
|
+
*/
|
|
110
|
+
loadToken(serviceName) {
|
|
111
|
+
const credName = this.credentialName(serviceName);
|
|
112
|
+
if (!this.credentialManager.exists(credName)) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const raw = this.credentialManager.get(credName, true);
|
|
117
|
+
return JSON.parse(raw);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// ── Core methods ────────────────────────────────────────────────────────
|
|
124
|
+
/**
|
|
125
|
+
* Check whether the token is expired (or close to expiry) and refresh if needed.
|
|
126
|
+
* Returns the current token data if still valid, or a refreshed token.
|
|
127
|
+
*/
|
|
128
|
+
async refreshIfNeeded(serviceName, tokenData) {
|
|
129
|
+
if (!this.isExpiredOrExpiring(tokenData)) {
|
|
130
|
+
return tokenData;
|
|
131
|
+
}
|
|
132
|
+
return this.doRefresh(serviceName, tokenData);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Handle an authentication error (e.g., 401 response).
|
|
136
|
+
* If the error looks like a 401/auth error, attempt a token refresh.
|
|
137
|
+
* Returns refreshed token data on success, or re-throws on failure.
|
|
138
|
+
*/
|
|
139
|
+
async handleAuthError(serviceName, tokenData, error) {
|
|
140
|
+
if (!this.isAuthError(error)) {
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
return this.doRefresh(serviceName, tokenData);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Force a token refresh regardless of expiry status.
|
|
147
|
+
*/
|
|
148
|
+
async forceRefresh(serviceName, tokenData) {
|
|
149
|
+
return this.doRefresh(serviceName, tokenData);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check whether a token is expired or will expire within the buffer window.
|
|
153
|
+
*/
|
|
154
|
+
isExpiredOrExpiring(tokenData) {
|
|
155
|
+
return Date.now() >= tokenData.expiresAt - TOKEN_EXPIRY_BUFFER_MS;
|
|
156
|
+
}
|
|
157
|
+
// ── Private helpers ─────────────────────────────────────────────────────
|
|
158
|
+
credentialName(serviceName) {
|
|
159
|
+
return `oauth:${serviceName}`;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Determine if an error represents an HTTP 401 / auth failure.
|
|
163
|
+
*/
|
|
164
|
+
isAuthError(error) {
|
|
165
|
+
if (error == null)
|
|
166
|
+
return false;
|
|
167
|
+
// Check for status / statusCode properties
|
|
168
|
+
if (typeof error === 'object') {
|
|
169
|
+
const obj = error;
|
|
170
|
+
if (obj['status'] === 401 || obj['statusCode'] === 401)
|
|
171
|
+
return true;
|
|
172
|
+
if (typeof obj['code'] === 'string' && obj['code'] === 'UNAUTHENTICATED')
|
|
173
|
+
return true;
|
|
174
|
+
// Nested response.status pattern (e.g. Axios errors)
|
|
175
|
+
if (typeof obj['response'] === 'object' &&
|
|
176
|
+
obj['response'] !== null &&
|
|
177
|
+
obj['response']['status'] === 401) {
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Check message string
|
|
182
|
+
if (error instanceof Error) {
|
|
183
|
+
const msg = error.message.toLowerCase();
|
|
184
|
+
if (msg.includes('401') || msg.includes('unauthorized') || msg.includes('unauthenticated')) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Perform the actual token refresh. Uses a lock to prevent concurrent
|
|
192
|
+
* refreshes for the same service.
|
|
193
|
+
*/
|
|
194
|
+
async doRefresh(serviceName, tokenData) {
|
|
195
|
+
// If there is already an in-flight refresh for this service, wait for it.
|
|
196
|
+
const existing = this.refreshLocks.get(serviceName);
|
|
197
|
+
if (existing) {
|
|
198
|
+
return existing;
|
|
199
|
+
}
|
|
200
|
+
const refreshPromise = this.executeRefresh(serviceName, tokenData);
|
|
201
|
+
this.refreshLocks.set(serviceName, refreshPromise);
|
|
202
|
+
try {
|
|
203
|
+
const result = await refreshPromise;
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
this.refreshLocks.delete(serviceName);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Execute the HTTP call to the token endpoint.
|
|
212
|
+
*/
|
|
213
|
+
async executeRefresh(serviceName, tokenData) {
|
|
214
|
+
const config = this.serviceConfigs.get(serviceName);
|
|
215
|
+
if (!config) {
|
|
216
|
+
const err = new Error(`No OAuth configuration registered for service "${serviceName}"`);
|
|
217
|
+
this.emit('token_refresh_failed', serviceName, err);
|
|
218
|
+
throw err;
|
|
219
|
+
}
|
|
220
|
+
// Use the stored config's refreshToken as fallback
|
|
221
|
+
const refreshToken = tokenData.refreshToken || config.refreshToken;
|
|
222
|
+
// Build the form body
|
|
223
|
+
const params = new URLSearchParams({
|
|
224
|
+
grant_type: 'refresh_token',
|
|
225
|
+
client_id: config.clientId,
|
|
226
|
+
client_secret: config.clientSecret,
|
|
227
|
+
refresh_token: refreshToken,
|
|
228
|
+
});
|
|
229
|
+
if (config.scope) {
|
|
230
|
+
params.set('scope', config.scope);
|
|
231
|
+
}
|
|
232
|
+
if (config.extraParams) {
|
|
233
|
+
for (const [key, value] of Object.entries(config.extraParams)) {
|
|
234
|
+
params.set(key, value);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
try {
|
|
238
|
+
const response = await fetch(config.tokenEndpoint, {
|
|
239
|
+
method: 'POST',
|
|
240
|
+
headers: {
|
|
241
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
242
|
+
Accept: 'application/json',
|
|
243
|
+
},
|
|
244
|
+
body: params.toString(),
|
|
245
|
+
});
|
|
246
|
+
if (!response.ok) {
|
|
247
|
+
const body = await response.text();
|
|
248
|
+
throw new Error(`Token refresh failed for "${serviceName}": HTTP ${response.status} - ${body}`);
|
|
249
|
+
}
|
|
250
|
+
const data = (await response.json());
|
|
251
|
+
const newTokenData = {
|
|
252
|
+
accessToken: data.access_token,
|
|
253
|
+
// Some providers rotate refresh tokens; use the new one if provided.
|
|
254
|
+
refreshToken: data.refresh_token ?? refreshToken,
|
|
255
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
256
|
+
tokenType: data.token_type ?? tokenData.tokenType,
|
|
257
|
+
scope: data.scope ?? tokenData.scope,
|
|
258
|
+
};
|
|
259
|
+
// Persist to credential store
|
|
260
|
+
this.saveToken(serviceName, newTokenData);
|
|
261
|
+
// Also update the service config's refresh token if it was rotated.
|
|
262
|
+
if (data.refresh_token && data.refresh_token !== config.refreshToken) {
|
|
263
|
+
config.refreshToken = data.refresh_token;
|
|
264
|
+
}
|
|
265
|
+
this.emit('token_refreshed', serviceName, newTokenData);
|
|
266
|
+
return newTokenData;
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
const wrappedError = error instanceof Error
|
|
270
|
+
? error
|
|
271
|
+
: new Error(`Token refresh failed: ${String(error)}`);
|
|
272
|
+
this.emit('token_refresh_failed', serviceName, wrappedError);
|
|
273
|
+
throw wrappedError;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// ── Factory helpers ─────────────────────────────────────────────────────────
|
|
278
|
+
/**
|
|
279
|
+
* Create an OAuthTokenManager wired to the given CredentialManager.
|
|
280
|
+
*/
|
|
281
|
+
export function createOAuthTokenManager(credentialManager) {
|
|
282
|
+
return new OAuthTokenManager(credentialManager);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Well-known token endpoints for convenience.
|
|
286
|
+
*/
|
|
287
|
+
export const TOKEN_ENDPOINTS = {
|
|
288
|
+
google: GOOGLE_TOKEN_ENDPOINT,
|
|
289
|
+
microsoft: MICROSOFT_TOKEN_ENDPOINT,
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=oauth-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-manager.js","sourceRoot":"","sources":["../src/oauth-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Token Refresh Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides automatic token refresh for OAuth2 providers.
|
|
5
|
+
*/
|
|
6
|
+
export interface OAuthTokens {
|
|
7
|
+
accessToken: string;
|
|
8
|
+
refreshToken?: string;
|
|
9
|
+
expiresIn?: number;
|
|
10
|
+
tokenType?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface GoogleOAuthRefreshResponse {
|
|
13
|
+
access_token: string;
|
|
14
|
+
expires_in: number;
|
|
15
|
+
scope?: string;
|
|
16
|
+
token_type: string;
|
|
17
|
+
}
|
|
18
|
+
export interface MicrosoftOAuthRefreshResponse {
|
|
19
|
+
access_token: string;
|
|
20
|
+
expires_in: number;
|
|
21
|
+
ext_expires_in?: number;
|
|
22
|
+
token_type: string;
|
|
23
|
+
scope?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Refresh Google OAuth2 access token using refresh token
|
|
27
|
+
*/
|
|
28
|
+
export declare function refreshGoogleToken(clientId: string, clientSecret: string, refreshToken: string): Promise<OAuthTokens>;
|
|
29
|
+
/**
|
|
30
|
+
* Refresh Microsoft Graph OAuth2 access token using refresh token
|
|
31
|
+
*/
|
|
32
|
+
export declare function refreshMicrosoftToken(clientId: string, clientSecret: string, refreshToken: string, tenantId?: string): Promise<OAuthTokens>;
|
|
33
|
+
/**
|
|
34
|
+
* Generic OAuth2 token refresh
|
|
35
|
+
*/
|
|
36
|
+
export declare function refreshOAuthToken(provider: 'google' | 'microsoft', clientId: string, clientSecret: string, refreshToken: string, tenantId?: string): Promise<OAuthTokens>;
|
|
37
|
+
//# sourceMappingURL=oauth-refresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-refresh.d.ts","sourceRoot":"","sources":["../src/oauth-refresh.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC,CA2BtB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,GAAE,MAAiB,GAC1B,OAAO,CAAC,WAAW,CAAC,CA4BtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,GAAG,WAAW,EAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CAStB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth Token Refresh Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides automatic token refresh for OAuth2 providers.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Refresh Google OAuth2 access token using refresh token
|
|
8
|
+
*/
|
|
9
|
+
export async function refreshGoogleToken(clientId, clientSecret, refreshToken) {
|
|
10
|
+
const response = await fetch('https://oauth2.googleapis.com/token', {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
14
|
+
},
|
|
15
|
+
body: new URLSearchParams({
|
|
16
|
+
client_id: clientId,
|
|
17
|
+
client_secret: clientSecret,
|
|
18
|
+
refresh_token: refreshToken,
|
|
19
|
+
grant_type: 'refresh_token',
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
const error = await response.text();
|
|
24
|
+
throw new Error(`Failed to refresh Google token: ${response.status} ${error}`);
|
|
25
|
+
}
|
|
26
|
+
const data = (await response.json());
|
|
27
|
+
return {
|
|
28
|
+
accessToken: data.access_token,
|
|
29
|
+
refreshToken, // Google doesn't return a new refresh token
|
|
30
|
+
expiresIn: data.expires_in,
|
|
31
|
+
tokenType: data.token_type,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Refresh Microsoft Graph OAuth2 access token using refresh token
|
|
36
|
+
*/
|
|
37
|
+
export async function refreshMicrosoftToken(clientId, clientSecret, refreshToken, tenantId = 'common') {
|
|
38
|
+
const response = await fetch(`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
42
|
+
},
|
|
43
|
+
body: new URLSearchParams({
|
|
44
|
+
client_id: clientId,
|
|
45
|
+
client_secret: clientSecret,
|
|
46
|
+
refresh_token: refreshToken,
|
|
47
|
+
grant_type: 'refresh_token',
|
|
48
|
+
scope: 'https://graph.microsoft.com/.default',
|
|
49
|
+
}),
|
|
50
|
+
});
|
|
51
|
+
if (!response.ok) {
|
|
52
|
+
const error = await response.text();
|
|
53
|
+
throw new Error(`Failed to refresh Microsoft token: ${response.status} ${error}`);
|
|
54
|
+
}
|
|
55
|
+
const data = (await response.json());
|
|
56
|
+
return {
|
|
57
|
+
accessToken: data.access_token,
|
|
58
|
+
refreshToken, // Microsoft may return a new refresh token in some flows
|
|
59
|
+
expiresIn: data.expires_in,
|
|
60
|
+
tokenType: data.token_type,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Generic OAuth2 token refresh
|
|
65
|
+
*/
|
|
66
|
+
export async function refreshOAuthToken(provider, clientId, clientSecret, refreshToken, tenantId) {
|
|
67
|
+
switch (provider) {
|
|
68
|
+
case 'google':
|
|
69
|
+
return refreshGoogleToken(clientId, clientSecret, refreshToken);
|
|
70
|
+
case 'microsoft':
|
|
71
|
+
return refreshMicrosoftToken(clientId, clientSecret, refreshToken, tenantId);
|
|
72
|
+
default:
|
|
73
|
+
throw new Error(`Unsupported OAuth provider: ${provider}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=oauth-refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-refresh.js","sourceRoot":"","sources":["../src/oauth-refresh.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,YAAoB,EACpB,YAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;QAClE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,eAAe;SAC5B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA+B,CAAC;IAEnE,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,YAAY,EAAE,4CAA4C;QAC1D,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,YAAoB,EACpB,YAAoB,EACpB,WAAmB,QAAQ;IAE3B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qCAAqC,QAAQ,oBAAoB,EAAE;QAC9F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;SACpD;QACD,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,eAAe;YAC3B,KAAK,EAAE,sCAAsC;SAC9C,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkC,CAAC;IAEtE,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,YAAY,EAAE,yDAAyD;QACvE,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgC,EAChC,QAAgB,EAChB,YAAoB,EACpB,YAAoB,EACpB,QAAiB;IAEjB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAClE,KAAK,WAAW;YACd,OAAO,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC/E;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
package/dist/parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,QAAQ,EAOT,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,UAAW,SAAQ,KAAK;aAGjB,IAAI,CAAC,EAAE,MAAM;aACb,OAAO,CAAC,EAAE,OAAO;gBAFjC,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AASD;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAG9F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,CAwCrF;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,QAAQ,EAOT,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,UAAW,SAAQ,KAAK;aAGjB,IAAI,CAAC,EAAE,MAAM;aACb,OAAO,CAAC,EAAE,OAAO;gBAFjC,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AASD;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAG9F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,CAwCrF;AAygBD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAUpE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAAE,CA8BvE"}
|