@framingui/mcp-server 0.6.26 → 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 +4 -3
- package/dist/__tests__/react-native-contract.test.d.ts +2 -0
- package/dist/__tests__/react-native-contract.test.d.ts.map +1 -0
- package/dist/__tests__/react-native-contract.test.js +50 -0
- package/dist/__tests__/react-native-contract.test.js.map +1 -0
- package/dist/auth/state.d.ts +16 -0
- package/dist/auth/state.d.ts.map +1 -1
- package/dist/auth/state.js +54 -15
- 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 +58 -38
- 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 +20 -36
- 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/init.d.ts +2 -3
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +33 -48
- package/dist/cli/init.js.map +1 -1
- 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-fallback-catalog.d.ts +26 -0
- package/dist/data/component-fallback-catalog.d.ts.map +1 -0
- package/dist/data/component-fallback-catalog.js +149 -0
- package/dist/data/component-fallback-catalog.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/data/react-native-runtime-catalog.d.ts +24 -0
- package/dist/data/react-native-runtime-catalog.d.ts.map +1 -0
- package/dist/data/react-native-runtime-catalog.js +265 -0
- package/dist/data/react-native-runtime-catalog.js.map +1 -0
- package/dist/index.js +225 -205
- package/dist/index.js.map +1 -1
- package/dist/platform-support.d.ts +22 -0
- package/dist/platform-support.d.ts.map +1 -0
- package/dist/platform-support.js +148 -0
- package/dist/platform-support.js.map +1 -0
- package/dist/project-context-resolution.d.ts +7 -0
- package/dist/project-context-resolution.d.ts.map +1 -0
- package/dist/project-context-resolution.js +21 -0
- package/dist/project-context-resolution.js.map +1 -0
- package/dist/project-context-state.d.ts +12 -0
- package/dist/project-context-state.d.ts.map +1 -0
- package/dist/project-context-state.js +14 -0
- package/dist/project-context-state.js.map +1 -0
- package/dist/project-context.d.ts +15 -0
- package/dist/project-context.d.ts.map +1 -0
- package/dist/project-context.js +78 -0
- package/dist/project-context.js.map +1 -0
- package/dist/prompts/doctor-workflow.js +1 -1
- package/dist/prompts/getting-started.d.ts.map +1 -1
- package/dist/prompts/getting-started.js +36 -15
- package/dist/prompts/getting-started.js.map +1 -1
- package/dist/prompts/screen-workflow.d.ts.map +1 -1
- package/dist/prompts/screen-workflow.js +54 -3
- package/dist/prompts/screen-workflow.js.map +1 -1
- package/dist/schemas/mcp-schemas.d.ts +954 -309
- package/dist/schemas/mcp-schemas.d.ts.map +1 -1
- package/dist/schemas/mcp-schemas.js +130 -1
- package/dist/schemas/mcp-schemas.js.map +1 -1
- package/dist/tools/detect-project-context.d.ts +5 -0
- package/dist/tools/detect-project-context.d.ts.map +1 -0
- package/dist/tools/detect-project-context.js +36 -0
- package/dist/tools/detect-project-context.js.map +1 -0
- 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 +120 -20
- package/dist/tools/get-screen-generation-context.js.map +1 -1
- package/dist/tools/list-components.d.ts.map +1 -1
- package/dist/tools/list-components.js +42 -3
- package/dist/tools/list-components.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-component.d.ts.map +1 -1
- package/dist/tools/preview-component.js +57 -7
- package/dist/tools/preview-component.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 +48 -21
- package/dist/tools/preview-theme.js.map +1 -1
- package/dist/tools/theme-authority.js +1 -1
- package/dist/tools/theme-authority.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 +102 -9
- package/dist/tools/validate-environment.js.map +1 -1
- package/dist/tools/validate-screen-definition.d.ts.map +1 -1
- package/dist/tools/validate-screen-definition.js +41 -7
- package/dist/tools/validate-screen-definition.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 +3 -3
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
|
|
@@ -115,8 +117,7 @@ FramingUI exposes guidance for:
|
|
|
115
117
|
`init` can:
|
|
116
118
|
|
|
117
119
|
- install the FramingUI screen-generation runtime and peer dependencies in one pass
|
|
118
|
-
-
|
|
119
|
-
- configure Tailwind content paths for Tailwind v3 projects
|
|
120
|
+
- configure Tailwind content paths and `tailwindcss-animate`
|
|
120
121
|
- add `@import '@framingui/ui/styles';` to a detected global stylesheet
|
|
121
122
|
- generate a local `framingui-theme` module
|
|
122
123
|
- wire `FramingUIProvider` into `app/layout.tsx` or `src/main.tsx`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-native-contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/react-native-contract.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { getPlatformSupportInfo, getImportStatementForPlatform, getReactNativeAuditRules, getSupportedPlatforms, } from '../platform-support.js';
|
|
3
|
+
import { GetScreenGenerationContextInputSchema, ListComponentsInputSchema, PreviewComponentInputSchema, ValidateEnvironmentInputSchema, } from '../schemas/mcp-schemas.js';
|
|
4
|
+
describe('React Native direct-write contract', () => {
|
|
5
|
+
it('exposes web and react-native platform targets', () => {
|
|
6
|
+
expect(getSupportedPlatforms()).toEqual(['web', 'react-native']);
|
|
7
|
+
});
|
|
8
|
+
it('marks primitive components as recommended for react-native direct write', () => {
|
|
9
|
+
const info = getPlatformSupportInfo('Button', 'react-native');
|
|
10
|
+
expect(info.supported).toBe(true);
|
|
11
|
+
expect(info.recommended).toBe(true);
|
|
12
|
+
expect(info.status).toBe('full');
|
|
13
|
+
expect(info.recommendedImports).toContain('@framingui/react-native');
|
|
14
|
+
expect(info.recommendedPackages).toContain('@framingui/react-native');
|
|
15
|
+
});
|
|
16
|
+
it('returns runtime package imports for primitives with extracted native exports', () => {
|
|
17
|
+
expect(getImportStatementForPlatform('Button', 'react-native')).toBe("import { Button } from '@framingui/react-native';");
|
|
18
|
+
expect(getImportStatementForPlatform('Input', 'react-native')).toBe("import { TextField } from '@framingui/react-native';");
|
|
19
|
+
});
|
|
20
|
+
it('marks web-centric components as avoid for react-native direct write', () => {
|
|
21
|
+
const info = getPlatformSupportInfo('Table', 'react-native');
|
|
22
|
+
expect(info.supported).toBe(false);
|
|
23
|
+
expect(info.status).toBe('avoid');
|
|
24
|
+
expect(info.notes[0]).toContain('web-only');
|
|
25
|
+
});
|
|
26
|
+
it('defines react-native audit rules for direct-write qc', () => {
|
|
27
|
+
const rules = getReactNativeAuditRules();
|
|
28
|
+
expect(rules.map(rule => rule.id)).toEqual([
|
|
29
|
+
'rn-hardcoded-color',
|
|
30
|
+
'rn-hardcoded-spacing',
|
|
31
|
+
'rn-web-classname',
|
|
32
|
+
]);
|
|
33
|
+
});
|
|
34
|
+
it('accepts react-native as a schema input target', () => {
|
|
35
|
+
expect(ListComponentsInputSchema.parse({ platform: 'react-native' }).platform).toBe('react-native');
|
|
36
|
+
expect(PreviewComponentInputSchema.parse({ componentId: 'button', platform: 'react-native' })
|
|
37
|
+
.platform).toBe('react-native');
|
|
38
|
+
expect(GetScreenGenerationContextInputSchema.parse({
|
|
39
|
+
description: 'profile screen',
|
|
40
|
+
platform: 'react-native',
|
|
41
|
+
}).platform).toBe('react-native');
|
|
42
|
+
expect(ValidateEnvironmentInputSchema.parse({
|
|
43
|
+
projectPath: '/tmp/project',
|
|
44
|
+
requiredPackages: [],
|
|
45
|
+
platform: 'react-native',
|
|
46
|
+
sourceFiles: ['/tmp/App.tsx'],
|
|
47
|
+
}).platform).toBe('react-native');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=react-native-contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-native-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/react-native-contract.test.ts"],"names":[],"mappings":"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"}
|
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
|
|
@@ -13,6 +23,11 @@ export declare function setAuthData(authData: VerifyResponse | null): void;
|
|
|
13
23
|
* @returns Current authentication data or null if not authenticated
|
|
14
24
|
*/
|
|
15
25
|
export declare function getAuthData(): VerifyResponse | null;
|
|
26
|
+
/**
|
|
27
|
+
* Whether auth state was explicitly injected via login/verify/test helpers.
|
|
28
|
+
* When false, the server is operating on credential-file fallback only.
|
|
29
|
+
*/
|
|
30
|
+
export declare function isAuthStateExplicitlySet(): boolean;
|
|
16
31
|
/**
|
|
17
32
|
* Store raw API key for data-client API calls
|
|
18
33
|
*/
|
|
@@ -38,4 +53,5 @@ export declare function isAuthenticated(): boolean;
|
|
|
38
53
|
* @returns Array of accessible theme IDs
|
|
39
54
|
*/
|
|
40
55
|
export declare function getAccessibleThemes(allThemeIds: string[]): string[];
|
|
56
|
+
export {};
|
|
41
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
|
@@ -5,22 +5,28 @@
|
|
|
5
5
|
import { MemoryCache } from './cache.js';
|
|
6
6
|
import { info } from '../utils/logger.js';
|
|
7
7
|
import { isMasterAccount } from './theme-access.js';
|
|
8
|
+
import { loadCredentials } from '../cli/credentials.js';
|
|
8
9
|
// Cache TTL: 5 minutes (300,000 milliseconds)
|
|
9
10
|
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
+
}
|
|
16
20
|
/**
|
|
17
21
|
* Set authentication data and cache it
|
|
18
22
|
* @param authData - Verification response from API
|
|
19
23
|
*/
|
|
20
24
|
export function setAuthData(authData) {
|
|
21
|
-
|
|
25
|
+
const state = getGlobalAuthState();
|
|
26
|
+
state.currentAuthData = authData;
|
|
27
|
+
state.authStateExplicitlySet = true;
|
|
22
28
|
if (authData && authData.valid) {
|
|
23
|
-
authCache.set('auth', authData, CACHE_TTL_MS);
|
|
29
|
+
state.authCache.set('auth', authData, CACHE_TTL_MS);
|
|
24
30
|
info('Authentication data cached for 5 minutes');
|
|
25
31
|
}
|
|
26
32
|
}
|
|
@@ -29,34 +35,67 @@ export function setAuthData(authData) {
|
|
|
29
35
|
* @returns Current authentication data or null if not authenticated
|
|
30
36
|
*/
|
|
31
37
|
export function getAuthData() {
|
|
38
|
+
const state = getGlobalAuthState();
|
|
32
39
|
// Try to get from cache first
|
|
33
|
-
const cachedAuth = authCache.get('auth');
|
|
40
|
+
const cachedAuth = state.authCache.get('auth');
|
|
34
41
|
if (cachedAuth) {
|
|
35
42
|
info('Using cached authentication data');
|
|
36
43
|
return cachedAuth;
|
|
37
44
|
}
|
|
45
|
+
if (!state.authStateExplicitlySet) {
|
|
46
|
+
const credentials = loadCredentials();
|
|
47
|
+
if (credentials?.api_key) {
|
|
48
|
+
state.rawApiKey = state.rawApiKey ?? credentials.api_key;
|
|
49
|
+
state.currentAuthData = {
|
|
50
|
+
valid: true,
|
|
51
|
+
user: {
|
|
52
|
+
id: 'credentials-user',
|
|
53
|
+
email: credentials.user_email,
|
|
54
|
+
plan: 'pro',
|
|
55
|
+
},
|
|
56
|
+
themes: { licensed: [] },
|
|
57
|
+
};
|
|
58
|
+
return state.currentAuthData;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
38
61
|
// Return current state
|
|
39
|
-
return currentAuthData;
|
|
62
|
+
return state.currentAuthData;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Whether auth state was explicitly injected via login/verify/test helpers.
|
|
66
|
+
* When false, the server is operating on credential-file fallback only.
|
|
67
|
+
*/
|
|
68
|
+
export function isAuthStateExplicitlySet() {
|
|
69
|
+
return getGlobalAuthState().authStateExplicitlySet;
|
|
40
70
|
}
|
|
41
71
|
/**
|
|
42
72
|
* Store raw API key for data-client API calls
|
|
43
73
|
*/
|
|
44
74
|
export function setRawApiKey(apiKey) {
|
|
45
|
-
rawApiKey = apiKey;
|
|
75
|
+
getGlobalAuthState().rawApiKey = apiKey;
|
|
46
76
|
}
|
|
47
77
|
/**
|
|
48
78
|
* Get raw API key for data-client API calls
|
|
49
79
|
*/
|
|
50
80
|
export function getRawApiKey() {
|
|
51
|
-
|
|
81
|
+
const state = getGlobalAuthState();
|
|
82
|
+
if (!state.rawApiKey) {
|
|
83
|
+
const credentials = loadCredentials();
|
|
84
|
+
if (credentials?.api_key) {
|
|
85
|
+
state.rawApiKey = credentials.api_key;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return state.rawApiKey;
|
|
52
89
|
}
|
|
53
90
|
/**
|
|
54
91
|
* Clear authentication data and cache
|
|
55
92
|
*/
|
|
56
93
|
export function clearAuthData() {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
94
|
+
const state = getGlobalAuthState();
|
|
95
|
+
state.currentAuthData = null;
|
|
96
|
+
state.rawApiKey = null;
|
|
97
|
+
state.authStateExplicitlySet = false;
|
|
98
|
+
state.authCache.clear();
|
|
60
99
|
info('Authentication data cleared');
|
|
61
100
|
}
|
|
62
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;
|
|
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":"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"}
|
|
@@ -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"}
|