@framingui/mcp-server 0.6.27 → 0.6.28
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 +3 -1
- package/dist/auth/state.d.ts +11 -0
- package/dist/auth/state.d.ts.map +1 -1
- package/dist/auth/state.js +31 -25
- package/dist/auth/state.js.map +1 -1
- package/dist/auth/verify.d.ts +9 -0
- package/dist/auth/verify.d.ts.map +1 -1
- package/dist/auth/verify.js.map +1 -1
- package/dist/billing/quota-policy.d.ts +13 -0
- package/dist/billing/quota-policy.d.ts.map +1 -0
- package/dist/billing/quota-policy.js +32 -0
- package/dist/billing/quota-policy.js.map +1 -0
- package/dist/billing/tool-metering.d.ts +10 -0
- package/dist/billing/tool-metering.d.ts.map +1 -0
- package/dist/billing/tool-metering.js +126 -0
- package/dist/billing/tool-metering.js.map +1 -0
- package/dist/billing/usage-ledger.d.ts +61 -0
- package/dist/billing/usage-ledger.d.ts.map +1 -0
- package/dist/billing/usage-ledger.js +102 -0
- package/dist/billing/usage-ledger.js.map +1 -0
- package/dist/billing/usage-sync.d.ts +3 -0
- package/dist/billing/usage-sync.d.ts.map +1 -0
- package/dist/billing/usage-sync.js +40 -0
- package/dist/billing/usage-sync.js.map +1 -0
- package/dist/cli/agent-md-templates.d.ts.map +1 -1
- package/dist/cli/agent-md-templates.js +4 -2
- package/dist/cli/agent-md-templates.js.map +1 -1
- package/dist/cli/commands.d.ts +2 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +20 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/guide-template.d.ts.map +1 -1
- package/dist/cli/guide-template.js +3 -1
- package/dist/cli/guide-template.js.map +1 -1
- package/dist/cli/help.d.ts +5 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +59 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/package-manager.d.ts +5 -0
- package/dist/cli/package-manager.d.ts.map +1 -0
- package/dist/cli/package-manager.js +34 -0
- package/dist/cli/package-manager.js.map +1 -0
- package/dist/cli/update.d.ts +8 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +53 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/commands/slash-command-adapters.d.ts +9 -0
- package/dist/commands/slash-command-adapters.d.ts.map +1 -0
- package/dist/commands/slash-command-adapters.js +116 -0
- package/dist/commands/slash-command-adapters.js.map +1 -0
- package/dist/data/component-props.d.ts +30 -0
- package/dist/data/component-props.d.ts.map +1 -0
- package/dist/data/component-props.js +537 -0
- package/dist/data/component-props.js.map +1 -0
- package/dist/data/component-registry.d.ts +30 -0
- package/dist/data/component-registry.d.ts.map +1 -0
- package/dist/data/component-registry.js +320 -0
- package/dist/data/component-registry.js.map +1 -0
- package/dist/data/examples/screen-examples.d.ts +38 -0
- package/dist/data/examples/screen-examples.d.ts.map +1 -0
- package/dist/data/examples/screen-examples.js +500 -0
- package/dist/data/examples/screen-examples.js.map +1 -0
- package/dist/index.js +130 -177
- package/dist/index.js.map +1 -1
- package/dist/prompts/doctor-workflow.js +1 -1
- package/dist/prompts/getting-started.d.ts.map +1 -1
- package/dist/prompts/getting-started.js +10 -9
- package/dist/prompts/getting-started.js.map +1 -1
- package/dist/prompts/screen-workflow.js +1 -1
- package/dist/schemas/mcp-schemas.d.ts +854 -739
- package/dist/schemas/mcp-schemas.d.ts.map +1 -1
- package/dist/schemas/mcp-schemas.js +32 -1
- package/dist/schemas/mcp-schemas.js.map +1 -1
- package/dist/tools/detect-project-context.d.ts +3 -1
- package/dist/tools/detect-project-context.d.ts.map +1 -1
- package/dist/tools/detect-project-context.js.map +1 -1
- package/dist/tools/get-screen-generation-context.d.ts +3 -1
- package/dist/tools/get-screen-generation-context.d.ts.map +1 -1
- package/dist/tools/get-screen-generation-context.js +2 -2
- package/dist/tools/get-screen-generation-context.js.map +1 -1
- package/dist/tools/list-screen-templates.d.ts +3 -1
- package/dist/tools/list-screen-templates.d.ts.map +1 -1
- package/dist/tools/list-screen-templates.js +3 -3
- package/dist/tools/list-screen-templates.js.map +1 -1
- package/dist/tools/preview-theme.d.ts +3 -1
- package/dist/tools/preview-theme.d.ts.map +1 -1
- package/dist/tools/preview-theme.js +28 -19
- package/dist/tools/preview-theme.js.map +1 -1
- package/dist/tools/validate-environment.d.ts +3 -1
- package/dist/tools/validate-environment.d.ts.map +1 -1
- package/dist/tools/validate-environment.js.map +1 -1
- package/dist/tools/whoami.d.ts.map +1 -1
- package/dist/tools/whoami.js +27 -17
- package/dist/tools/whoami.js.map +1 -1
- package/dist/utils/style-contract-reader.d.ts +10 -0
- package/dist/utils/style-contract-reader.d.ts.map +1 -0
- package/dist/utils/style-contract-reader.js +67 -0
- package/dist/utils/style-contract-reader.js.map +1 -0
- package/package.json +17 -16
- package/LICENSE +0 -21
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
MCP server for building production UI through FramingUI.
|
|
4
4
|
|
|
5
|
-
`@framingui/mcp-server` gives AI coding agents a real UI contract: components, themes, layout tokens,
|
|
5
|
+
`@framingui/mcp-server` gives AI coding agents a real UI contract: components, themes, layout tokens, validated workflows, quota visibility, and environment checks.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
@@ -24,6 +24,8 @@ Authenticate:
|
|
|
24
24
|
npx -y @framingui/mcp-server@latest login
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
`whoami` now also returns a shadow quota snapshot so teams can inspect weighted tool-unit usage before usage-based billing is enforced.
|
|
28
|
+
|
|
27
29
|
## CLI Commands
|
|
28
30
|
|
|
29
31
|
```bash
|
package/dist/auth/state.d.ts
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
* SPEC-DEPLOY-001 Phase 4.1: MCP Server Authentication Layer
|
|
4
4
|
*/
|
|
5
5
|
import type { VerifyResponse } from './verify.js';
|
|
6
|
+
import { MemoryCache } from './cache.js';
|
|
7
|
+
interface FraminguiAuthState {
|
|
8
|
+
authCache: MemoryCache<VerifyResponse>;
|
|
9
|
+
currentAuthData: VerifyResponse | null;
|
|
10
|
+
authStateExplicitlySet: boolean;
|
|
11
|
+
rawApiKey: string | null;
|
|
12
|
+
}
|
|
13
|
+
declare global {
|
|
14
|
+
var __framinguiAuthState: FraminguiAuthState | undefined;
|
|
15
|
+
}
|
|
6
16
|
/**
|
|
7
17
|
* Set authentication data and cache it
|
|
8
18
|
* @param authData - Verification response from API
|
|
@@ -43,4 +53,5 @@ export declare function isAuthenticated(): boolean;
|
|
|
43
53
|
* @returns Array of accessible theme IDs
|
|
44
54
|
*/
|
|
45
55
|
export declare function getAccessibleThemes(allThemeIds: string[]): string[];
|
|
56
|
+
export {};
|
|
46
57
|
//# sourceMappingURL=state.d.ts.map
|
package/dist/auth/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/auth/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/auth/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQzC,UAAU,kBAAkB;IAC1B,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IACvC,eAAe,EAAE,cAAc,GAAG,IAAI,CAAC;IACvC,sBAAsB,EAAE,OAAO,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,oBAAoB,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC1D;AAaD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CASjE;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,cAAc,GAAG,IAAI,CA8BnD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAU5C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAOpC;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAoBnE"}
|
package/dist/auth/state.js
CHANGED
|
@@ -8,22 +8,25 @@ import { isMasterAccount } from './theme-access.js';
|
|
|
8
8
|
import { loadCredentials } from '../cli/credentials.js';
|
|
9
9
|
// Cache TTL: 5 minutes (300,000 milliseconds)
|
|
10
10
|
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
function getGlobalAuthState() {
|
|
12
|
+
globalThis.__framinguiAuthState ??= {
|
|
13
|
+
authCache: new MemoryCache(),
|
|
14
|
+
currentAuthData: null,
|
|
15
|
+
authStateExplicitlySet: false,
|
|
16
|
+
rawApiKey: null,
|
|
17
|
+
};
|
|
18
|
+
return globalThis.__framinguiAuthState;
|
|
19
|
+
}
|
|
18
20
|
/**
|
|
19
21
|
* Set authentication data and cache it
|
|
20
22
|
* @param authData - Verification response from API
|
|
21
23
|
*/
|
|
22
24
|
export function setAuthData(authData) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
const state = getGlobalAuthState();
|
|
26
|
+
state.currentAuthData = authData;
|
|
27
|
+
state.authStateExplicitlySet = true;
|
|
25
28
|
if (authData && authData.valid) {
|
|
26
|
-
authCache.set('auth', authData, CACHE_TTL_MS);
|
|
29
|
+
state.authCache.set('auth', authData, CACHE_TTL_MS);
|
|
27
30
|
info('Authentication data cached for 5 minutes');
|
|
28
31
|
}
|
|
29
32
|
}
|
|
@@ -32,17 +35,18 @@ export function setAuthData(authData) {
|
|
|
32
35
|
* @returns Current authentication data or null if not authenticated
|
|
33
36
|
*/
|
|
34
37
|
export function getAuthData() {
|
|
38
|
+
const state = getGlobalAuthState();
|
|
35
39
|
// Try to get from cache first
|
|
36
|
-
const cachedAuth = authCache.get('auth');
|
|
40
|
+
const cachedAuth = state.authCache.get('auth');
|
|
37
41
|
if (cachedAuth) {
|
|
38
42
|
info('Using cached authentication data');
|
|
39
43
|
return cachedAuth;
|
|
40
44
|
}
|
|
41
|
-
if (!authStateExplicitlySet) {
|
|
45
|
+
if (!state.authStateExplicitlySet) {
|
|
42
46
|
const credentials = loadCredentials();
|
|
43
47
|
if (credentials?.api_key) {
|
|
44
|
-
rawApiKey = rawApiKey ?? credentials.api_key;
|
|
45
|
-
currentAuthData = {
|
|
48
|
+
state.rawApiKey = state.rawApiKey ?? credentials.api_key;
|
|
49
|
+
state.currentAuthData = {
|
|
46
50
|
valid: true,
|
|
47
51
|
user: {
|
|
48
52
|
id: 'credentials-user',
|
|
@@ -51,45 +55,47 @@ export function getAuthData() {
|
|
|
51
55
|
},
|
|
52
56
|
themes: { licensed: [] },
|
|
53
57
|
};
|
|
54
|
-
return currentAuthData;
|
|
58
|
+
return state.currentAuthData;
|
|
55
59
|
}
|
|
56
60
|
}
|
|
57
61
|
// Return current state
|
|
58
|
-
return currentAuthData;
|
|
62
|
+
return state.currentAuthData;
|
|
59
63
|
}
|
|
60
64
|
/**
|
|
61
65
|
* Whether auth state was explicitly injected via login/verify/test helpers.
|
|
62
66
|
* When false, the server is operating on credential-file fallback only.
|
|
63
67
|
*/
|
|
64
68
|
export function isAuthStateExplicitlySet() {
|
|
65
|
-
return authStateExplicitlySet;
|
|
69
|
+
return getGlobalAuthState().authStateExplicitlySet;
|
|
66
70
|
}
|
|
67
71
|
/**
|
|
68
72
|
* Store raw API key for data-client API calls
|
|
69
73
|
*/
|
|
70
74
|
export function setRawApiKey(apiKey) {
|
|
71
|
-
rawApiKey = apiKey;
|
|
75
|
+
getGlobalAuthState().rawApiKey = apiKey;
|
|
72
76
|
}
|
|
73
77
|
/**
|
|
74
78
|
* Get raw API key for data-client API calls
|
|
75
79
|
*/
|
|
76
80
|
export function getRawApiKey() {
|
|
77
|
-
|
|
81
|
+
const state = getGlobalAuthState();
|
|
82
|
+
if (!state.rawApiKey) {
|
|
78
83
|
const credentials = loadCredentials();
|
|
79
84
|
if (credentials?.api_key) {
|
|
80
|
-
rawApiKey = credentials.api_key;
|
|
85
|
+
state.rawApiKey = credentials.api_key;
|
|
81
86
|
}
|
|
82
87
|
}
|
|
83
|
-
return rawApiKey;
|
|
88
|
+
return state.rawApiKey;
|
|
84
89
|
}
|
|
85
90
|
/**
|
|
86
91
|
* Clear authentication data and cache
|
|
87
92
|
*/
|
|
88
93
|
export function clearAuthData() {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
94
|
+
const state = getGlobalAuthState();
|
|
95
|
+
state.currentAuthData = null;
|
|
96
|
+
state.rawApiKey = null;
|
|
97
|
+
state.authStateExplicitlySet = false;
|
|
98
|
+
state.authCache.clear();
|
|
93
99
|
info('Authentication data cleared');
|
|
94
100
|
}
|
|
95
101
|
/**
|
package/dist/auth/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/auth/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,8CAA8C;AAC9C,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/auth/state.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/verify.d.ts
CHANGED
|
@@ -21,6 +21,15 @@ export interface VerifyResponse {
|
|
|
21
21
|
/** @deprecated free 테마 개념 제거됨 - 하위 호환용 */
|
|
22
22
|
free?: string[];
|
|
23
23
|
};
|
|
24
|
+
quotaEntitlement?: {
|
|
25
|
+
planId: string;
|
|
26
|
+
status: string;
|
|
27
|
+
includedUnits: number;
|
|
28
|
+
currentPeriodStart: string | null;
|
|
29
|
+
currentPeriodEnd: string | null;
|
|
30
|
+
totalAllocatedUnits: number;
|
|
31
|
+
topUpAllocatedUnits: number;
|
|
32
|
+
} | null;
|
|
24
33
|
error?: string;
|
|
25
34
|
}
|
|
26
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/auth/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;QAC1C,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;IACH,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,0CAA0C;QAC1C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoD1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,EAAE,CAM3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CASjG"}
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/auth/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;QAC1C,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;IACH,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,0CAA0C;QAC1C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,mBAAmB,EAAE,MAAM,CAAC;QAC5B,mBAAmB,EAAE,MAAM,CAAC;KAC7B,GAAG,IAAI,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoD1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,EAAE,CAM3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CASjG"}
|
package/dist/auth/verify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/auth/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/auth/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { UsageQuotaSnapshot } from './usage-ledger.js';
|
|
2
|
+
export type QuotaEnforcementMode = 'shadow' | 'soft_cap' | 'hard_cap';
|
|
3
|
+
export interface QuotaPolicyDecision {
|
|
4
|
+
allowed: boolean;
|
|
5
|
+
reason: 'ok' | 'quota_exceeded';
|
|
6
|
+
warning?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function getQuotaEnforcementMode(): QuotaEnforcementMode;
|
|
9
|
+
export declare function evaluateQuotaPolicy(options: {
|
|
10
|
+
toolName: string;
|
|
11
|
+
snapshot: UsageQuotaSnapshot;
|
|
12
|
+
}): QuotaPolicyDecision;
|
|
13
|
+
//# sourceMappingURL=quota-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-policy.d.ts","sourceRoot":"","sources":["../../src/billing/quota-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,gBAAgB,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAM9D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,kBAAkB,CAAC;CAC9B,GAAG,mBAAmB,CA6BtB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { getToolMeteringRule } from './tool-metering.js';
|
|
2
|
+
export function getQuotaEnforcementMode() {
|
|
3
|
+
const raw = process.env.FRAMINGUI_QUOTA_ENFORCEMENT?.trim().toLowerCase();
|
|
4
|
+
if (raw === 'soft_cap' || raw === 'hard_cap') {
|
|
5
|
+
return raw;
|
|
6
|
+
}
|
|
7
|
+
return 'shadow';
|
|
8
|
+
}
|
|
9
|
+
export function evaluateQuotaPolicy(options) {
|
|
10
|
+
const rule = getToolMeteringRule(options.toolName);
|
|
11
|
+
const mode = getQuotaEnforcementMode();
|
|
12
|
+
if (mode === 'shadow' || !rule.billable || options.snapshot.monthlyIncludedUnits === null) {
|
|
13
|
+
return { allowed: true, reason: 'ok' };
|
|
14
|
+
}
|
|
15
|
+
const projectedUnits = options.snapshot.usedUnits + rule.units;
|
|
16
|
+
if (projectedUnits <= options.snapshot.monthlyIncludedUnits) {
|
|
17
|
+
return { allowed: true, reason: 'ok' };
|
|
18
|
+
}
|
|
19
|
+
if (mode === 'soft_cap') {
|
|
20
|
+
return {
|
|
21
|
+
allowed: true,
|
|
22
|
+
reason: 'ok',
|
|
23
|
+
warning: 'Projected usage exceeds the included quota in soft cap mode. This call is allowed, but additional usage would be billable in an enforced rollout.',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
allowed: false,
|
|
28
|
+
reason: 'quota_exceeded',
|
|
29
|
+
warning: 'Projected usage exceeds the included quota and hard cap mode is enabled. Upgrade or add quota before retrying this tool.',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=quota-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-policy.js","sourceRoot":"","sources":["../../src/billing/quota-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAWzD,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1E,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QAC7C,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAGnC;IACC,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,uBAAuB,EAAE,CAAC;IAEvC,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;QAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;IAE/D,IAAI,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;QAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,IAAI;YACZ,OAAO,EACL,mJAAmJ;SACtJ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,gBAAgB;QACxB,OAAO,EACL,0HAA0H;KAC7H,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ToolMeteringClass = 'account' | 'discovery' | 'context' | 'generation' | 'guarded' | 'execution';
|
|
2
|
+
export interface ToolMeteringRule {
|
|
3
|
+
toolName: string;
|
|
4
|
+
billable: boolean;
|
|
5
|
+
toolClass: ToolMeteringClass;
|
|
6
|
+
units: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function getToolMeteringRule(toolName: string): ToolMeteringRule;
|
|
9
|
+
export declare function listToolMeteringRules(): ToolMeteringRule[];
|
|
10
|
+
//# sourceMappingURL=tool-metering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-metering.d.ts","sourceRoot":"","sources":["../../src/billing/tool-metering.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,WAAW,GACX,SAAS,GACT,YAAY,GACZ,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAwHD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAOtE;AAED,wBAAgB,qBAAqB,IAAI,gBAAgB,EAAE,CAE1D"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
const TOOL_METERING_RULES = {
|
|
2
|
+
whoami: {
|
|
3
|
+
toolName: 'whoami',
|
|
4
|
+
billable: false,
|
|
5
|
+
toolClass: 'account',
|
|
6
|
+
units: 0,
|
|
7
|
+
},
|
|
8
|
+
'detect-project-context': {
|
|
9
|
+
toolName: 'detect-project-context',
|
|
10
|
+
billable: false,
|
|
11
|
+
toolClass: 'account',
|
|
12
|
+
units: 0,
|
|
13
|
+
},
|
|
14
|
+
'list-icon-libraries': {
|
|
15
|
+
toolName: 'list-icon-libraries',
|
|
16
|
+
billable: true,
|
|
17
|
+
toolClass: 'discovery',
|
|
18
|
+
units: 1,
|
|
19
|
+
},
|
|
20
|
+
'preview-icon-library': {
|
|
21
|
+
toolName: 'preview-icon-library',
|
|
22
|
+
billable: true,
|
|
23
|
+
toolClass: 'discovery',
|
|
24
|
+
units: 1,
|
|
25
|
+
},
|
|
26
|
+
'list-themes': {
|
|
27
|
+
toolName: 'list-themes',
|
|
28
|
+
billable: true,
|
|
29
|
+
toolClass: 'discovery',
|
|
30
|
+
units: 1,
|
|
31
|
+
},
|
|
32
|
+
'preview-theme': {
|
|
33
|
+
toolName: 'preview-theme',
|
|
34
|
+
billable: true,
|
|
35
|
+
toolClass: 'context',
|
|
36
|
+
units: 2,
|
|
37
|
+
},
|
|
38
|
+
list_tokens: {
|
|
39
|
+
toolName: 'list_tokens',
|
|
40
|
+
billable: true,
|
|
41
|
+
toolClass: 'discovery',
|
|
42
|
+
units: 1,
|
|
43
|
+
},
|
|
44
|
+
'list-components': {
|
|
45
|
+
toolName: 'list-components',
|
|
46
|
+
billable: true,
|
|
47
|
+
toolClass: 'discovery',
|
|
48
|
+
units: 1,
|
|
49
|
+
},
|
|
50
|
+
'preview-component': {
|
|
51
|
+
toolName: 'preview-component',
|
|
52
|
+
billable: true,
|
|
53
|
+
toolClass: 'discovery',
|
|
54
|
+
units: 1,
|
|
55
|
+
},
|
|
56
|
+
'list-screen-templates': {
|
|
57
|
+
toolName: 'list-screen-templates',
|
|
58
|
+
billable: true,
|
|
59
|
+
toolClass: 'discovery',
|
|
60
|
+
units: 1,
|
|
61
|
+
},
|
|
62
|
+
'preview-screen-template': {
|
|
63
|
+
toolName: 'preview-screen-template',
|
|
64
|
+
billable: true,
|
|
65
|
+
toolClass: 'context',
|
|
66
|
+
units: 2,
|
|
67
|
+
},
|
|
68
|
+
'get-screen-generation-context': {
|
|
69
|
+
toolName: 'get-screen-generation-context',
|
|
70
|
+
billable: true,
|
|
71
|
+
toolClass: 'context',
|
|
72
|
+
units: 2,
|
|
73
|
+
},
|
|
74
|
+
'generate-blueprint': {
|
|
75
|
+
toolName: 'generate-blueprint',
|
|
76
|
+
billable: true,
|
|
77
|
+
toolClass: 'generation',
|
|
78
|
+
units: 4,
|
|
79
|
+
},
|
|
80
|
+
generate_screen: {
|
|
81
|
+
toolName: 'generate_screen',
|
|
82
|
+
billable: true,
|
|
83
|
+
toolClass: 'generation',
|
|
84
|
+
units: 4,
|
|
85
|
+
},
|
|
86
|
+
'export-screen': {
|
|
87
|
+
toolName: 'export-screen',
|
|
88
|
+
billable: true,
|
|
89
|
+
toolClass: 'execution',
|
|
90
|
+
units: 10,
|
|
91
|
+
},
|
|
92
|
+
validate_screen: {
|
|
93
|
+
toolName: 'validate_screen',
|
|
94
|
+
billable: true,
|
|
95
|
+
toolClass: 'guarded',
|
|
96
|
+
units: 6,
|
|
97
|
+
},
|
|
98
|
+
'validate-screen-definition': {
|
|
99
|
+
toolName: 'validate-screen-definition',
|
|
100
|
+
billable: true,
|
|
101
|
+
toolClass: 'guarded',
|
|
102
|
+
units: 6,
|
|
103
|
+
},
|
|
104
|
+
'validate-environment': {
|
|
105
|
+
toolName: 'validate-environment',
|
|
106
|
+
billable: true,
|
|
107
|
+
toolClass: 'guarded',
|
|
108
|
+
units: 6,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
const DEFAULT_TOOL_RULE = {
|
|
112
|
+
toolName: 'unknown',
|
|
113
|
+
billable: true,
|
|
114
|
+
toolClass: 'execution',
|
|
115
|
+
units: 10,
|
|
116
|
+
};
|
|
117
|
+
export function getToolMeteringRule(toolName) {
|
|
118
|
+
return (TOOL_METERING_RULES[toolName] ?? {
|
|
119
|
+
...DEFAULT_TOOL_RULE,
|
|
120
|
+
toolName,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
export function listToolMeteringRules() {
|
|
124
|
+
return Object.values(TOOL_METERING_RULES);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=tool-metering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-metering.js","sourceRoot":"","sources":["../../src/billing/tool-metering.ts"],"names":[],"mappings":"AAeA,MAAM,mBAAmB,GAAqC;IAC5D,MAAM,EAAE;QACN,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,CAAC;KACT;IACD,wBAAwB,EAAE;QACxB,QAAQ,EAAE,wBAAwB;QAClC,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,CAAC;KACT;IACD,qBAAqB,EAAE;QACrB,QAAQ,EAAE,qBAAqB;QAC/B,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,CAAC;KACT;IACD,sBAAsB,EAAE;QACtB,QAAQ,EAAE,sBAAsB;QAChC,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,CAAC;KACT;IACD,aAAa,EAAE;QACb,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,CAAC;KACT;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,CAAC;KACT;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,CAAC;KACT;IACD,iBAAiB,EAAE;QACjB,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,CAAC;KACT;IACD,mBAAmB,EAAE;QACnB,QAAQ,EAAE,mBAAmB;QAC7B,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,CAAC;KACT;IACD,uBAAuB,EAAE;QACvB,QAAQ,EAAE,uBAAuB;QACjC,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,CAAC;KACT;IACD,yBAAyB,EAAE;QACzB,QAAQ,EAAE,yBAAyB;QACnC,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,CAAC;KACT;IACD,+BAA+B,EAAE;QAC/B,QAAQ,EAAE,+BAA+B;QACzC,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,CAAC;KACT;IACD,oBAAoB,EAAE;QACpB,QAAQ,EAAE,oBAAoB;QAC9B,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,CAAC;KACT;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,CAAC;KACT;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,WAAW;QACtB,KAAK,EAAE,EAAE;KACV;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,CAAC;KACT;IACD,4BAA4B,EAAE;QAC5B,QAAQ,EAAE,4BAA4B;QACtC,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,CAAC;KACT;IACD,sBAAsB,EAAE;QACtB,QAAQ,EAAE,sBAAsB;QAChC,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,CAAC;KACT;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAqB;IAC1C,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO,CACL,mBAAmB,CAAC,QAAQ,CAAC,IAAI;QAC/B,GAAG,iBAAiB;QACpB,QAAQ;KACT,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type ToolMeteringClass } from './tool-metering.js';
|
|
2
|
+
export type UsageOutcome = 'success' | 'tool_error' | 'validation_error' | 'auth_error' | 'runtime_error';
|
|
3
|
+
export type BillingPlan = 'free' | 'pro' | 'enterprise' | 'master';
|
|
4
|
+
export interface UsageLedgerEntry {
|
|
5
|
+
id: string;
|
|
6
|
+
timestamp: string;
|
|
7
|
+
toolName: string;
|
|
8
|
+
toolClass: ToolMeteringClass;
|
|
9
|
+
billable: boolean;
|
|
10
|
+
units: number;
|
|
11
|
+
outcome: UsageOutcome;
|
|
12
|
+
userId: string | null;
|
|
13
|
+
plan: BillingPlan | null;
|
|
14
|
+
}
|
|
15
|
+
export interface UsageQuotaSnapshot {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
billingPhase: 'shadow';
|
|
18
|
+
unitModel: 'weighted_tool_units';
|
|
19
|
+
monthlyIncludedUnits: number | null;
|
|
20
|
+
usedUnits: number;
|
|
21
|
+
remainingUnits: number | null;
|
|
22
|
+
usagePercent: number | null;
|
|
23
|
+
warningThresholds: number[];
|
|
24
|
+
warningsTriggered: number[];
|
|
25
|
+
currentPeriodStart: string;
|
|
26
|
+
currentPeriodEnd: string;
|
|
27
|
+
}
|
|
28
|
+
export interface PaidQuotaEntitlementSnapshot {
|
|
29
|
+
planId: string;
|
|
30
|
+
status: string;
|
|
31
|
+
includedUnits: number;
|
|
32
|
+
currentPeriodStart: string | null;
|
|
33
|
+
currentPeriodEnd: string | null;
|
|
34
|
+
totalAllocatedUnits: number;
|
|
35
|
+
topUpAllocatedUnits: number;
|
|
36
|
+
}
|
|
37
|
+
interface FraminguiUsageLedgerState {
|
|
38
|
+
usageLedger: UsageLedgerEntry[];
|
|
39
|
+
sequence: number;
|
|
40
|
+
}
|
|
41
|
+
declare global {
|
|
42
|
+
var __framinguiUsageLedgerState: FraminguiUsageLedgerState | undefined;
|
|
43
|
+
}
|
|
44
|
+
export declare function recordToolUsage(options: {
|
|
45
|
+
toolName: string;
|
|
46
|
+
outcome: UsageOutcome;
|
|
47
|
+
userId?: string | null;
|
|
48
|
+
plan?: string | null;
|
|
49
|
+
timestamp?: Date;
|
|
50
|
+
}): UsageLedgerEntry;
|
|
51
|
+
export declare function listUsageEntries(): UsageLedgerEntry[];
|
|
52
|
+
export declare function resetUsageLedger(): void;
|
|
53
|
+
export declare function normalizeBillingPlan(plan: string | null | undefined): BillingPlan | null;
|
|
54
|
+
export declare function getUsageQuotaSnapshot(options: {
|
|
55
|
+
userId?: string | null;
|
|
56
|
+
plan?: string | null;
|
|
57
|
+
paidQuotaEntitlement?: PaidQuotaEntitlementSnapshot | null;
|
|
58
|
+
now?: Date;
|
|
59
|
+
}): UsageQuotaSnapshot;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=usage-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-ledger.d.ts","sourceRoot":"","sources":["../../src/billing/usage-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,YAAY,GACZ,kBAAkB,GAClB,YAAY,GACZ,eAAe,CAAC;AAEpB,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,QAAQ,CAAC;IACvB,SAAS,EAAE,qBAAqB,CAAC;IACjC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AASD,UAAU,yBAAyB;IACjC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,2BAA2B,EAAE,yBAAyB,GAAG,SAAS,CAAC;CACxE;AAiBD,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,GAAG,gBAAgB,CAsBnB;AAED,wBAAgB,gBAAgB,IAAI,gBAAgB,EAAE,CAErD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,IAAI,CAKxF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oBAAoB,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAC3D,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ,GAAG,kBAAkB,CAwDrB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { getToolMeteringRule } from './tool-metering.js';
|
|
2
|
+
const PLAN_MONTHLY_QUOTAS = {
|
|
3
|
+
free: 100,
|
|
4
|
+
pro: 2_000,
|
|
5
|
+
enterprise: 10_000,
|
|
6
|
+
master: null,
|
|
7
|
+
};
|
|
8
|
+
function getUsageLedgerState() {
|
|
9
|
+
globalThis.__framinguiUsageLedgerState ??= {
|
|
10
|
+
usageLedger: [],
|
|
11
|
+
sequence: 0,
|
|
12
|
+
};
|
|
13
|
+
return globalThis.__framinguiUsageLedgerState;
|
|
14
|
+
}
|
|
15
|
+
function getCurrentPeriod(now) {
|
|
16
|
+
const start = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1, 0, 0, 0, 0));
|
|
17
|
+
const end = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1, 0, 0, 0, 0));
|
|
18
|
+
return { start, end };
|
|
19
|
+
}
|
|
20
|
+
export function recordToolUsage(options) {
|
|
21
|
+
const state = getUsageLedgerState();
|
|
22
|
+
const timestamp = options.timestamp ?? new Date();
|
|
23
|
+
const rule = getToolMeteringRule(options.toolName);
|
|
24
|
+
const normalizedPlan = normalizeBillingPlan(options.plan);
|
|
25
|
+
state.sequence += 1;
|
|
26
|
+
const entry = {
|
|
27
|
+
id: `usage-${state.sequence}`,
|
|
28
|
+
timestamp: timestamp.toISOString(),
|
|
29
|
+
toolName: options.toolName,
|
|
30
|
+
toolClass: rule.toolClass,
|
|
31
|
+
billable: rule.billable,
|
|
32
|
+
units: rule.billable ? rule.units : 0,
|
|
33
|
+
outcome: options.outcome,
|
|
34
|
+
userId: options.userId ?? null,
|
|
35
|
+
plan: normalizedPlan,
|
|
36
|
+
};
|
|
37
|
+
state.usageLedger.push(entry);
|
|
38
|
+
return entry;
|
|
39
|
+
}
|
|
40
|
+
export function listUsageEntries() {
|
|
41
|
+
return [...getUsageLedgerState().usageLedger];
|
|
42
|
+
}
|
|
43
|
+
export function resetUsageLedger() {
|
|
44
|
+
const state = getUsageLedgerState();
|
|
45
|
+
state.usageLedger.length = 0;
|
|
46
|
+
state.sequence = 0;
|
|
47
|
+
}
|
|
48
|
+
export function normalizeBillingPlan(plan) {
|
|
49
|
+
if (plan === 'free' || plan === 'pro' || plan === 'enterprise' || plan === 'master') {
|
|
50
|
+
return plan;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
export function getUsageQuotaSnapshot(options) {
|
|
55
|
+
const state = getUsageLedgerState();
|
|
56
|
+
const now = options.now ?? new Date();
|
|
57
|
+
const entitlementPeriod = options.paidQuotaEntitlement?.currentPeriodStart &&
|
|
58
|
+
options.paidQuotaEntitlement?.currentPeriodEnd
|
|
59
|
+
? {
|
|
60
|
+
start: new Date(options.paidQuotaEntitlement.currentPeriodStart),
|
|
61
|
+
end: new Date(options.paidQuotaEntitlement.currentPeriodEnd),
|
|
62
|
+
}
|
|
63
|
+
: null;
|
|
64
|
+
const period = entitlementPeriod ?? getCurrentPeriod(now);
|
|
65
|
+
const normalizedPlan = normalizeBillingPlan(options.plan) ?? 'free';
|
|
66
|
+
const monthlyIncludedUnits = options.paidQuotaEntitlement?.status === 'active'
|
|
67
|
+
? options.paidQuotaEntitlement.includedUnits +
|
|
68
|
+
options.paidQuotaEntitlement.topUpAllocatedUnits
|
|
69
|
+
: PLAN_MONTHLY_QUOTAS[normalizedPlan];
|
|
70
|
+
const usedUnits = state.usageLedger
|
|
71
|
+
.filter(entry => {
|
|
72
|
+
if (!entry.billable) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
if (options.userId && entry.userId !== options.userId) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
const entryTime = new Date(entry.timestamp);
|
|
79
|
+
return entryTime >= period.start && entryTime < period.end;
|
|
80
|
+
})
|
|
81
|
+
.reduce((sum, entry) => sum + entry.units, 0);
|
|
82
|
+
const remainingUnits = monthlyIncludedUnits === null ? null : Math.max(0, monthlyIncludedUnits - usedUnits);
|
|
83
|
+
const usagePercent = monthlyIncludedUnits === null || monthlyIncludedUnits === 0
|
|
84
|
+
? null
|
|
85
|
+
: Math.min(100, Math.round((usedUnits / monthlyIncludedUnits) * 100));
|
|
86
|
+
const warningThresholds = [50, 80, 100];
|
|
87
|
+
const warningsTriggered = usagePercent === null ? [] : warningThresholds.filter(threshold => usagePercent >= threshold);
|
|
88
|
+
return {
|
|
89
|
+
enabled: true,
|
|
90
|
+
billingPhase: 'shadow',
|
|
91
|
+
unitModel: 'weighted_tool_units',
|
|
92
|
+
monthlyIncludedUnits,
|
|
93
|
+
usedUnits,
|
|
94
|
+
remainingUnits,
|
|
95
|
+
usagePercent,
|
|
96
|
+
warningThresholds,
|
|
97
|
+
warningsTriggered,
|
|
98
|
+
currentPeriodStart: period.start.toISOString(),
|
|
99
|
+
currentPeriodEnd: period.end.toISOString(),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=usage-ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-ledger.js","sourceRoot":"","sources":["../../src/billing/usage-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-sync.d.ts","sourceRoot":"","sources":["../../src/billing/usage-sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,wBAAsB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyC3E"}
|