@frontmcp/plugin-approval 0.0.1 → 0.7.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/approval/errors.d.ts +149 -0
- package/approval/errors.d.ts.map +1 -0
- package/approval/factories.d.ts +251 -0
- package/approval/factories.d.ts.map +1 -0
- package/approval/guards.d.ts +61 -0
- package/approval/guards.d.ts.map +1 -0
- package/approval/index.d.ts +43 -0
- package/approval/index.d.ts.map +1 -0
- package/approval/schemas.d.ts +179 -0
- package/approval/schemas.d.ts.map +1 -0
- package/approval/types.d.ts +252 -0
- package/approval/types.d.ts.map +1 -0
- package/approval.context-extension.d.ts +21 -0
- package/approval.context-extension.d.ts.map +1 -0
- package/approval.plugin.d.ts +128 -0
- package/approval.plugin.d.ts.map +1 -0
- package/approval.symbols.d.ts +22 -0
- package/approval.symbols.d.ts.map +1 -0
- package/esm/index.mjs +1228 -0
- package/esm/package.json +66 -0
- package/flows/index.d.ts +9 -0
- package/flows/index.d.ts.map +1 -0
- package/hooks/approval-check.hook.d.ts +25 -0
- package/hooks/approval-check.hook.d.ts.map +1 -0
- package/hooks/index.d.ts +7 -0
- package/hooks/index.d.ts.map +1 -0
- package/index.d.ts +44 -0
- package/index.d.ts.map +1 -0
- package/index.js +1279 -0
- package/package.json +3 -3
- package/services/approval.service.d.ts +85 -0
- package/services/approval.service.d.ts.map +1 -0
- package/services/challenge.service.d.ts +115 -0
- package/services/challenge.service.d.ts.map +1 -0
- package/services/index.d.ts +8 -0
- package/services/index.d.ts.map +1 -0
- package/stores/approval-storage.store.d.ts +71 -0
- package/stores/approval-storage.store.d.ts.map +1 -0
- package/stores/approval-store.interface.d.ts +121 -0
- package/stores/approval-store.interface.d.ts.map +1 -0
- package/stores/index.d.ts +8 -0
- package/stores/index.d.ts.map +1 -0
- package/types/approval.types.d.ts +98 -0
- package/types/approval.types.d.ts.map +1 -0
- package/types/index.d.ts +7 -0
- package/types/index.d.ts.map +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frontmcp/plugin-approval",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Approval plugin for FrontMCP - tool authorization workflow with PKCE webhook security",
|
|
5
5
|
"author": "AgentFront <info@agentfront.dev>",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"ioredis": "^5.8.0",
|
|
50
|
-
"@frontmcp/sdk": "0.7.
|
|
51
|
-
"@frontmcp/utils": "0.7.
|
|
50
|
+
"@frontmcp/sdk": "0.7.1",
|
|
51
|
+
"@frontmcp/utils": "0.7.1",
|
|
52
52
|
"reflect-metadata": "^0.2.2",
|
|
53
53
|
"zod": "^4.0.0"
|
|
54
54
|
},
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for programmatically managing tool approvals.
|
|
3
|
+
*
|
|
4
|
+
* @module @frontmcp/plugin-approval
|
|
5
|
+
*/
|
|
6
|
+
import type { ApprovalStore, ApprovalQuery } from '../stores/approval-store.interface';
|
|
7
|
+
import type { ApprovalRecord, ApprovalContext, ApprovalGrantor, ApprovalRevoker, ApprovalSourceType, RevocationSourceType } from '../types';
|
|
8
|
+
/**
|
|
9
|
+
* Options for granting approvals via the service.
|
|
10
|
+
*/
|
|
11
|
+
export interface GrantOptions {
|
|
12
|
+
/** Who/what is granting the approval (defaults to 'policy') */
|
|
13
|
+
grantedBy?: ApprovalGrantor | ApprovalSourceType;
|
|
14
|
+
/** Optional reason for the approval */
|
|
15
|
+
reason?: string;
|
|
16
|
+
/** Additional metadata */
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for revoking approvals via the service.
|
|
21
|
+
*/
|
|
22
|
+
export interface RevokeOptions {
|
|
23
|
+
/** Who/what is revoking the approval (defaults to 'policy') */
|
|
24
|
+
revokedBy?: ApprovalRevoker | RevocationSourceType;
|
|
25
|
+
/** Optional reason for revocation */
|
|
26
|
+
reason?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Service for programmatically managing tool approvals.
|
|
30
|
+
*/
|
|
31
|
+
export declare class ApprovalService {
|
|
32
|
+
private readonly store;
|
|
33
|
+
private readonly sessionId;
|
|
34
|
+
private readonly userId?;
|
|
35
|
+
constructor(store: ApprovalStore, sessionId: string, userId?: string | undefined);
|
|
36
|
+
/**
|
|
37
|
+
* Check if a tool is approved for current session/user.
|
|
38
|
+
*/
|
|
39
|
+
isApproved(toolId: string, context?: ApprovalContext): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Get approval record for a tool.
|
|
42
|
+
*/
|
|
43
|
+
getApproval(toolId: string): Promise<ApprovalRecord | undefined>;
|
|
44
|
+
/**
|
|
45
|
+
* Get all approvals for current session.
|
|
46
|
+
*/
|
|
47
|
+
getSessionApprovals(): Promise<ApprovalRecord[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Get all approvals for current user (across sessions).
|
|
50
|
+
*/
|
|
51
|
+
getUserApprovals(): Promise<ApprovalRecord[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Query approvals with custom filters.
|
|
54
|
+
*/
|
|
55
|
+
queryApprovals(query: Partial<ApprovalQuery>): Promise<ApprovalRecord[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Grant session-scoped approval for a tool.
|
|
58
|
+
*/
|
|
59
|
+
grantSessionApproval(toolId: string, options?: GrantOptions): Promise<ApprovalRecord>;
|
|
60
|
+
/**
|
|
61
|
+
* Grant user-scoped approval for a tool.
|
|
62
|
+
*/
|
|
63
|
+
grantUserApproval(toolId: string, options?: GrantOptions): Promise<ApprovalRecord>;
|
|
64
|
+
/**
|
|
65
|
+
* Grant time-limited approval for a tool.
|
|
66
|
+
*/
|
|
67
|
+
grantTimeLimitedApproval(toolId: string, ttlMs: number, options?: GrantOptions): Promise<ApprovalRecord>;
|
|
68
|
+
/**
|
|
69
|
+
* Grant context-specific approval for a tool.
|
|
70
|
+
*/
|
|
71
|
+
grantContextApproval(toolId: string, context: ApprovalContext, options?: GrantOptions): Promise<ApprovalRecord>;
|
|
72
|
+
/**
|
|
73
|
+
* Revoke approval for a tool.
|
|
74
|
+
*/
|
|
75
|
+
revokeApproval(toolId: string, options?: RevokeOptions): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Clear all session approvals.
|
|
78
|
+
*/
|
|
79
|
+
clearSessionApprovals(): Promise<number>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Factory function for creating ApprovalService instances.
|
|
83
|
+
*/
|
|
84
|
+
export declare function createApprovalService(store: ApprovalStore, sessionId: string, userId?: string): ApprovalService;
|
|
85
|
+
//# sourceMappingURL=approval.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.service.d.ts","sourceRoot":"","sources":["../../src/services/approval.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAGlB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,eAAe,GAAG,kBAAkB,CAAC;IACjD,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,eAAe,GAAG,oBAAoB,CAAC;IACnD,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAKa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAFP,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,YAAA;IAOlC;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7E;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAItE;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAQtD;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAUnD;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAY9E;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAW/F;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAc5F;;OAEG;IACG,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAalH;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,cAAc,CAAC;IAiB1B;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnF;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;CAG/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAE/G"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PKCE Challenge Service for secure webhook approval flows.
|
|
3
|
+
*
|
|
4
|
+
* Implements RFC 7636 PKCE (Proof Key for Code Exchange) for secure
|
|
5
|
+
* authorization between the MCP server and external approval systems.
|
|
6
|
+
*
|
|
7
|
+
* @module @frontmcp/plugin-approval
|
|
8
|
+
*/
|
|
9
|
+
import { type NamespacedStorage, type RootStorage, type StorageConfig } from '@frontmcp/utils';
|
|
10
|
+
import type { ChallengeRecord } from '../types';
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for ChallengeService.
|
|
13
|
+
*/
|
|
14
|
+
export interface ChallengeServiceOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Storage configuration.
|
|
17
|
+
* @default { type: 'auto' }
|
|
18
|
+
*/
|
|
19
|
+
storage?: StorageConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Existing storage instance.
|
|
22
|
+
*/
|
|
23
|
+
storageInstance?: RootStorage | NamespacedStorage;
|
|
24
|
+
/**
|
|
25
|
+
* Namespace for challenge keys.
|
|
26
|
+
* @default 'approval:challenge'
|
|
27
|
+
*/
|
|
28
|
+
namespace?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Default challenge TTL in seconds.
|
|
31
|
+
* @default 300 (5 minutes)
|
|
32
|
+
*/
|
|
33
|
+
defaultTtlSeconds?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Options for creating a challenge.
|
|
37
|
+
*/
|
|
38
|
+
export interface CreateChallengeOptions {
|
|
39
|
+
/** Tool ID being approved */
|
|
40
|
+
toolId: string;
|
|
41
|
+
/** Session ID (kept internal, never exposed) */
|
|
42
|
+
sessionId: string;
|
|
43
|
+
/** User ID if available */
|
|
44
|
+
userId?: string;
|
|
45
|
+
/** Requested approval scope */
|
|
46
|
+
requestedScope: string;
|
|
47
|
+
/** Request information for webhook */
|
|
48
|
+
requestInfo: {
|
|
49
|
+
toolName: string;
|
|
50
|
+
category?: string;
|
|
51
|
+
riskLevel?: string;
|
|
52
|
+
customMessage?: string;
|
|
53
|
+
};
|
|
54
|
+
/** TTL in seconds (overrides default) */
|
|
55
|
+
ttlSeconds?: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Service for managing PKCE challenges in webhook approval flows.
|
|
59
|
+
*
|
|
60
|
+
* Flow:
|
|
61
|
+
* 1. Create challenge: generates code_verifier + code_challenge
|
|
62
|
+
* 2. Store challenge: saves code_challenge → record mapping
|
|
63
|
+
* 3. Send to webhook: includes code_challenge (NOT code_verifier)
|
|
64
|
+
* 4. Receive callback: validate code_verifier against stored challenge
|
|
65
|
+
* 5. Grant approval if valid
|
|
66
|
+
*/
|
|
67
|
+
export declare class ChallengeService {
|
|
68
|
+
private storage;
|
|
69
|
+
private readonly options;
|
|
70
|
+
private initialized;
|
|
71
|
+
private ownedStorage;
|
|
72
|
+
constructor(options?: ChallengeServiceOptions);
|
|
73
|
+
/**
|
|
74
|
+
* Initialize the service.
|
|
75
|
+
*/
|
|
76
|
+
initialize(): Promise<void>;
|
|
77
|
+
private ensureInitialized;
|
|
78
|
+
/**
|
|
79
|
+
* Create a new PKCE challenge for a tool approval request.
|
|
80
|
+
*
|
|
81
|
+
* @returns Object containing code_verifier (keep secret) and code_challenge (send to webhook)
|
|
82
|
+
*/
|
|
83
|
+
createChallenge(options: CreateChallengeOptions): Promise<{
|
|
84
|
+
codeVerifier: string;
|
|
85
|
+
codeChallenge: string;
|
|
86
|
+
expiresAt: number;
|
|
87
|
+
}>;
|
|
88
|
+
/**
|
|
89
|
+
* Verify a code verifier and retrieve the challenge record.
|
|
90
|
+
*
|
|
91
|
+
* @throws ChallengeValidationError if verification fails
|
|
92
|
+
*/
|
|
93
|
+
verifyAndConsume(codeVerifier: string): Promise<ChallengeRecord>;
|
|
94
|
+
/**
|
|
95
|
+
* Mark a challenge as having been sent to webhook.
|
|
96
|
+
*/
|
|
97
|
+
markWebhookSent(codeChallenge: string): Promise<boolean>;
|
|
98
|
+
/**
|
|
99
|
+
* Get a challenge record without consuming it.
|
|
100
|
+
*/
|
|
101
|
+
getChallenge(codeChallenge: string): Promise<ChallengeRecord | null>;
|
|
102
|
+
/**
|
|
103
|
+
* Delete a challenge.
|
|
104
|
+
*/
|
|
105
|
+
deleteChallenge(codeChallenge: string): Promise<boolean>;
|
|
106
|
+
/**
|
|
107
|
+
* Close the service.
|
|
108
|
+
*/
|
|
109
|
+
close(): Promise<void>;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Create a ChallengeService with memory storage.
|
|
113
|
+
*/
|
|
114
|
+
export declare function createMemoryChallengeService(options?: Omit<ChallengeServiceOptions, 'storage' | 'storageInstance'>): ChallengeService;
|
|
115
|
+
//# sourceMappingURL=challenge.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenge.service.d.ts","sourceRoot":"","sources":["../../src/services/challenge.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAGhB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;OAEG;IACH,eAAe,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAAC;IAElD;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IAEf,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAElB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;IAEvB,sCAAsC;IACtC,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,qBAKa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAEtB;IACF,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,GAAE,uBAA4B;IASjD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC,OAAO,CAAC,iBAAiB;IAMzB;;;;OAIG;IACG,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC;QAC9D,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAyBF;;;;OAIG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA0BtE;;OAEG;IACG,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB9D;;OAEG;IACG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAe1E;;OAEG;IACG,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B;AAaD;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,GAAG,iBAAiB,CAAM,GACzE,gBAAgB,CAMlB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service exports for ApprovalPlugin.
|
|
3
|
+
*
|
|
4
|
+
* @module @frontmcp/plugin-approval
|
|
5
|
+
*/
|
|
6
|
+
export { ApprovalService, createApprovalService, type GrantOptions, type RevokeOptions } from './approval.service';
|
|
7
|
+
export { ChallengeService, createMemoryChallengeService, type ChallengeServiceOptions, type CreateChallengeOptions, } from './challenge.service';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnH,OAAO,EACL,gBAAgB,EAChB,4BAA4B,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage-backed implementation of the ApprovalStore.
|
|
3
|
+
*
|
|
4
|
+
* @module @frontmcp/plugin-approval
|
|
5
|
+
*/
|
|
6
|
+
import { type RootStorage, type NamespacedStorage, type StorageConfig } from '@frontmcp/utils';
|
|
7
|
+
import type { ApprovalStore, ApprovalQuery, GrantApprovalOptions, RevokeApprovalOptions } from './approval-store.interface';
|
|
8
|
+
import { ApprovalScope, ApprovalState, type ApprovalRecord, type ApprovalContext } from '../types';
|
|
9
|
+
/**
|
|
10
|
+
* Configuration options for ApprovalStorageStore.
|
|
11
|
+
*/
|
|
12
|
+
export interface ApprovalStorageStoreOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Storage configuration. If not provided, uses auto-detection.
|
|
15
|
+
* @default { type: 'auto' }
|
|
16
|
+
*/
|
|
17
|
+
storage?: StorageConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Use an existing storage instance instead of creating a new one.
|
|
20
|
+
*/
|
|
21
|
+
storageInstance?: RootStorage | NamespacedStorage;
|
|
22
|
+
/**
|
|
23
|
+
* Namespace prefix for approval keys.
|
|
24
|
+
* @default 'approval'
|
|
25
|
+
*/
|
|
26
|
+
namespace?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Cleanup interval for expired approvals (in seconds).
|
|
29
|
+
* Set to 0 to disable automatic cleanup.
|
|
30
|
+
* @default 60
|
|
31
|
+
*/
|
|
32
|
+
cleanupIntervalSeconds?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Storage-backed implementation of the ApprovalStore.
|
|
36
|
+
* Works with any storage backend (memory, Redis, Vercel KV, Upstash).
|
|
37
|
+
*/
|
|
38
|
+
export declare class ApprovalStorageStore implements ApprovalStore {
|
|
39
|
+
private storage;
|
|
40
|
+
private readonly options;
|
|
41
|
+
private cleanupInterval?;
|
|
42
|
+
private initialized;
|
|
43
|
+
private ownedStorage;
|
|
44
|
+
constructor(options?: ApprovalStorageStoreOptions);
|
|
45
|
+
/**
|
|
46
|
+
* Initialize the storage connection.
|
|
47
|
+
*/
|
|
48
|
+
initialize(): Promise<void>;
|
|
49
|
+
private ensureInitialized;
|
|
50
|
+
private buildKey;
|
|
51
|
+
private parseRecord;
|
|
52
|
+
private isExpired;
|
|
53
|
+
getApproval(toolId: string, sessionId: string, userId?: string): Promise<ApprovalRecord | undefined>;
|
|
54
|
+
queryApprovals(query: ApprovalQuery): Promise<ApprovalRecord[]>;
|
|
55
|
+
grantApproval(options: GrantApprovalOptions): Promise<ApprovalRecord>;
|
|
56
|
+
revokeApproval(options: RevokeApprovalOptions): Promise<boolean>;
|
|
57
|
+
isApproved(toolId: string, sessionId: string, userId?: string, context?: ApprovalContext): Promise<boolean>;
|
|
58
|
+
clearSessionApprovals(sessionId: string): Promise<number>;
|
|
59
|
+
clearExpiredApprovals(): Promise<number>;
|
|
60
|
+
getStats(): Promise<{
|
|
61
|
+
totalApprovals: number;
|
|
62
|
+
byScope: Record<ApprovalScope, number>;
|
|
63
|
+
byState: Record<ApprovalState, number>;
|
|
64
|
+
}>;
|
|
65
|
+
close(): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create an ApprovalStorageStore with synchronous memory storage.
|
|
69
|
+
*/
|
|
70
|
+
export declare function createApprovalMemoryStore(options?: Omit<ApprovalStorageStoreOptions, 'storage' | 'storageInstance'>): ApprovalStorageStore;
|
|
71
|
+
//# sourceMappingURL=approval-storage.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-storage.store.d.ts","sourceRoot":"","sources":["../../src/stores/approval-storage.store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAkBnG;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB;;OAEG;IACH,eAAe,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAAC;IAElD;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAMD;;;GAGG;AACH,qBAKa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAEtB;IACF,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,GAAE,2BAAgC;IASrD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBjC,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,SAAS;IAIX,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAsBpG,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAwC/D,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IA6BrE,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC;IAahE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA+B3G,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAezD,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBxC,QAAQ,IAAI,OAAO,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;KACxC,CAAC;IAsCI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAY7B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,IAAI,CAAC,2BAA2B,EAAE,SAAS,GAAG,iBAAiB,CAAM,GAC7E,oBAAoB,CAMtB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for managing tool approvals.
|
|
3
|
+
*
|
|
4
|
+
* @module @frontmcp/plugin-approval
|
|
5
|
+
*/
|
|
6
|
+
import type { ApprovalScope, ApprovalState, ApprovalContext, ApprovalGrantor, ApprovalRevoker, ApprovalRecord, ApprovalSourceType, RevocationSourceType } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Query options for finding approvals.
|
|
9
|
+
*/
|
|
10
|
+
export interface ApprovalQuery {
|
|
11
|
+
/** Filter by tool ID */
|
|
12
|
+
toolId?: string;
|
|
13
|
+
/** Filter by multiple tool IDs */
|
|
14
|
+
toolIds?: string[];
|
|
15
|
+
/** Filter by scope */
|
|
16
|
+
scope?: ApprovalScope;
|
|
17
|
+
/** Filter by multiple scopes */
|
|
18
|
+
scopes?: ApprovalScope[];
|
|
19
|
+
/** Filter by state */
|
|
20
|
+
state?: ApprovalState;
|
|
21
|
+
/** Filter by multiple states */
|
|
22
|
+
states?: ApprovalState[];
|
|
23
|
+
/** Filter by session ID */
|
|
24
|
+
sessionId?: string;
|
|
25
|
+
/** Filter by user ID */
|
|
26
|
+
userId?: string;
|
|
27
|
+
/** Filter by context */
|
|
28
|
+
context?: ApprovalContext;
|
|
29
|
+
/** Include expired approvals (default: false) */
|
|
30
|
+
includeExpired?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Options for granting approval.
|
|
34
|
+
*/
|
|
35
|
+
export interface GrantApprovalOptions {
|
|
36
|
+
/** Tool identifier */
|
|
37
|
+
toolId: string;
|
|
38
|
+
/** Approval scope */
|
|
39
|
+
scope: ApprovalScope;
|
|
40
|
+
/** Time-to-live in milliseconds (for time-limited approvals) */
|
|
41
|
+
ttlMs?: number;
|
|
42
|
+
/** Session ID (required for session-scoped) */
|
|
43
|
+
sessionId?: string;
|
|
44
|
+
/** User ID (required for user-scoped) */
|
|
45
|
+
userId?: string;
|
|
46
|
+
/** Context (required for context-specific) */
|
|
47
|
+
context?: ApprovalContext;
|
|
48
|
+
/** Who/what granted the approval */
|
|
49
|
+
grantedBy?: ApprovalGrantor | ApprovalSourceType;
|
|
50
|
+
/** Optional reason for the approval */
|
|
51
|
+
reason?: string;
|
|
52
|
+
/** Additional metadata */
|
|
53
|
+
metadata?: Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Options for revoking approval.
|
|
57
|
+
*/
|
|
58
|
+
export interface RevokeApprovalOptions {
|
|
59
|
+
/** Tool identifier */
|
|
60
|
+
toolId: string;
|
|
61
|
+
/** Session ID (for session-scoped approvals) */
|
|
62
|
+
sessionId?: string;
|
|
63
|
+
/** User ID (for user-scoped approvals) */
|
|
64
|
+
userId?: string;
|
|
65
|
+
/** Context (for context-specific approvals) */
|
|
66
|
+
context?: ApprovalContext;
|
|
67
|
+
/** Who/what revoked the approval */
|
|
68
|
+
revokedBy?: ApprovalRevoker | RevocationSourceType;
|
|
69
|
+
/** Optional reason for revocation */
|
|
70
|
+
reason?: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Interface for managing tool approvals.
|
|
74
|
+
*/
|
|
75
|
+
export interface ApprovalStore {
|
|
76
|
+
/**
|
|
77
|
+
* Initialize the store.
|
|
78
|
+
*/
|
|
79
|
+
initialize(): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Get approval for a specific tool.
|
|
82
|
+
*/
|
|
83
|
+
getApproval(toolId: string, sessionId: string, userId?: string): Promise<ApprovalRecord | undefined>;
|
|
84
|
+
/**
|
|
85
|
+
* Get all approvals matching a query.
|
|
86
|
+
*/
|
|
87
|
+
queryApprovals(query: ApprovalQuery): Promise<ApprovalRecord[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Grant approval for a tool.
|
|
90
|
+
*/
|
|
91
|
+
grantApproval(options: GrantApprovalOptions): Promise<ApprovalRecord>;
|
|
92
|
+
/**
|
|
93
|
+
* Revoke approval for a tool.
|
|
94
|
+
*/
|
|
95
|
+
revokeApproval(options: RevokeApprovalOptions): Promise<boolean>;
|
|
96
|
+
/**
|
|
97
|
+
* Check if a tool is approved.
|
|
98
|
+
*/
|
|
99
|
+
isApproved(toolId: string, sessionId: string, userId?: string, context?: ApprovalContext): Promise<boolean>;
|
|
100
|
+
/**
|
|
101
|
+
* Clear all session approvals.
|
|
102
|
+
*/
|
|
103
|
+
clearSessionApprovals(sessionId: string): Promise<number>;
|
|
104
|
+
/**
|
|
105
|
+
* Clear expired approvals.
|
|
106
|
+
*/
|
|
107
|
+
clearExpiredApprovals(): Promise<number>;
|
|
108
|
+
/**
|
|
109
|
+
* Get approval statistics.
|
|
110
|
+
*/
|
|
111
|
+
getStats(): Promise<{
|
|
112
|
+
totalApprovals: number;
|
|
113
|
+
byScope: Record<ApprovalScope, number>;
|
|
114
|
+
byState: Record<ApprovalState, number>;
|
|
115
|
+
}>;
|
|
116
|
+
/**
|
|
117
|
+
* Close the store and cleanup.
|
|
118
|
+
*/
|
|
119
|
+
close(): Promise<void>;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=approval-store.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval-store.interface.d.ts","sourceRoot":"","sources":["../../src/stores/approval-store.interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store exports for ApprovalPlugin.
|
|
3
|
+
*
|
|
4
|
+
* @module @frontmcp/plugin-approval
|
|
5
|
+
*/
|
|
6
|
+
export type { ApprovalStore, ApprovalQuery, GrantApprovalOptions, RevokeApprovalOptions, } from './approval-store.interface';
|
|
7
|
+
export { ApprovalStorageStore, type ApprovalStorageStoreOptions, createApprovalMemoryStore, } from './approval-storage.store';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,EAChC,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Approval types for the plugin.
|
|
3
|
+
* Re-exports core types from the local approval module and defines plugin-specific types.
|
|
4
|
+
*
|
|
5
|
+
* @module @frontmcp/plugin-approval
|
|
6
|
+
*/
|
|
7
|
+
export { ApprovalScope, ApprovalState, type ApprovalSourceType, type RevocationSourceType, type ApprovalMethod, type ApprovalContext, type ApprovalGrantor, type ApprovalRevoker, type DelegationContext, type ApprovalRecord, type ToolApprovalRequirement, type ApprovalCategory, type RiskLevel, } from '../approval';
|
|
8
|
+
/**
|
|
9
|
+
* Approval workflow mode.
|
|
10
|
+
*/
|
|
11
|
+
export type ApprovalMode = 'recheck' | 'webhook';
|
|
12
|
+
/**
|
|
13
|
+
* Challenge record stored in Redis for PKCE webhook flow.
|
|
14
|
+
*/
|
|
15
|
+
export interface ChallengeRecord {
|
|
16
|
+
/** Tool ID being approved */
|
|
17
|
+
toolId: string;
|
|
18
|
+
/** Session ID (never exposed to webhook) */
|
|
19
|
+
sessionId: string;
|
|
20
|
+
/** User ID if available */
|
|
21
|
+
userId?: string;
|
|
22
|
+
/** Requested approval scope */
|
|
23
|
+
requestedScope: string;
|
|
24
|
+
/** Request information sent to webhook */
|
|
25
|
+
requestInfo: {
|
|
26
|
+
toolName: string;
|
|
27
|
+
category?: string;
|
|
28
|
+
riskLevel?: string;
|
|
29
|
+
customMessage?: string;
|
|
30
|
+
};
|
|
31
|
+
/** When the challenge was created */
|
|
32
|
+
createdAt: number;
|
|
33
|
+
/** When the challenge expires */
|
|
34
|
+
expiresAt: number;
|
|
35
|
+
/** Whether webhook has been sent */
|
|
36
|
+
webhookSent: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Webhook payload sent to external approval system.
|
|
40
|
+
*/
|
|
41
|
+
export interface WebhookPayload {
|
|
42
|
+
/** PKCE code challenge (SHA256 of code_verifier) */
|
|
43
|
+
codeChallenge: string;
|
|
44
|
+
/** Tool being approved */
|
|
45
|
+
toolId: string;
|
|
46
|
+
/** Tool name */
|
|
47
|
+
toolName: string;
|
|
48
|
+
/** Tool category */
|
|
49
|
+
category?: string;
|
|
50
|
+
/** Risk level */
|
|
51
|
+
riskLevel?: string;
|
|
52
|
+
/** Custom approval message */
|
|
53
|
+
approvalMessage?: string;
|
|
54
|
+
/** URL for callback */
|
|
55
|
+
callbackUrl: string;
|
|
56
|
+
/** Request timestamp */
|
|
57
|
+
timestamp: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Callback payload received from external approval system.
|
|
61
|
+
*/
|
|
62
|
+
export interface CallbackPayload {
|
|
63
|
+
/** PKCE code verifier (proves knowledge of challenge) */
|
|
64
|
+
codeVerifier: string;
|
|
65
|
+
/** Whether approved or denied */
|
|
66
|
+
approved: boolean;
|
|
67
|
+
/** Approval scope if approved */
|
|
68
|
+
scope?: string;
|
|
69
|
+
/** TTL in milliseconds if time-limited */
|
|
70
|
+
ttlMs?: number;
|
|
71
|
+
/** Who granted the approval */
|
|
72
|
+
grantedBy?: {
|
|
73
|
+
source: string;
|
|
74
|
+
identifier?: string;
|
|
75
|
+
displayName?: string;
|
|
76
|
+
};
|
|
77
|
+
/** Optional reason */
|
|
78
|
+
reason?: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Recheck response from external approval API.
|
|
82
|
+
*/
|
|
83
|
+
export interface RecheckResponse {
|
|
84
|
+
/** Whether approved */
|
|
85
|
+
approved: boolean;
|
|
86
|
+
/** Approval scope if approved */
|
|
87
|
+
scope?: string;
|
|
88
|
+
/** TTL in milliseconds if time-limited */
|
|
89
|
+
ttlMs?: number;
|
|
90
|
+
/** Who granted the approval */
|
|
91
|
+
grantedBy?: {
|
|
92
|
+
source: string;
|
|
93
|
+
identifier?: string;
|
|
94
|
+
};
|
|
95
|
+
/** Reason for denial if denied */
|
|
96
|
+
denialReason?: string;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=approval.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval.types.d.ts","sourceRoot":"","sources":["../../src/types/approval.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,aAAa,EACb,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,SAAS,GACf,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IAEf,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAElB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;IAEvB,0CAA0C;IAC1C,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAElB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAElB,oCAAoC;IACpC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IAEtB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IAEf,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IAEjB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,8BAA8B;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IAEpB,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IAErB,iCAAiC;IACjC,QAAQ,EAAE,OAAO,CAAC;IAElB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,+BAA+B;IAC/B,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,QAAQ,EAAE,OAAO,CAAC;IAElB,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,+BAA+B;IAC/B,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,kBAAkB,CAAC"}
|