@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.
Files changed (100) hide show
  1. package/README.md +3 -1
  2. package/dist/auth/state.d.ts +11 -0
  3. package/dist/auth/state.d.ts.map +1 -1
  4. package/dist/auth/state.js +31 -25
  5. package/dist/auth/state.js.map +1 -1
  6. package/dist/auth/verify.d.ts +9 -0
  7. package/dist/auth/verify.d.ts.map +1 -1
  8. package/dist/auth/verify.js.map +1 -1
  9. package/dist/billing/quota-policy.d.ts +13 -0
  10. package/dist/billing/quota-policy.d.ts.map +1 -0
  11. package/dist/billing/quota-policy.js +32 -0
  12. package/dist/billing/quota-policy.js.map +1 -0
  13. package/dist/billing/tool-metering.d.ts +10 -0
  14. package/dist/billing/tool-metering.d.ts.map +1 -0
  15. package/dist/billing/tool-metering.js +126 -0
  16. package/dist/billing/tool-metering.js.map +1 -0
  17. package/dist/billing/usage-ledger.d.ts +61 -0
  18. package/dist/billing/usage-ledger.d.ts.map +1 -0
  19. package/dist/billing/usage-ledger.js +102 -0
  20. package/dist/billing/usage-ledger.js.map +1 -0
  21. package/dist/billing/usage-sync.d.ts +3 -0
  22. package/dist/billing/usage-sync.d.ts.map +1 -0
  23. package/dist/billing/usage-sync.js +40 -0
  24. package/dist/billing/usage-sync.js.map +1 -0
  25. package/dist/cli/agent-md-templates.d.ts.map +1 -1
  26. package/dist/cli/agent-md-templates.js +4 -2
  27. package/dist/cli/agent-md-templates.js.map +1 -1
  28. package/dist/cli/commands.d.ts +2 -0
  29. package/dist/cli/commands.d.ts.map +1 -0
  30. package/dist/cli/commands.js +20 -0
  31. package/dist/cli/commands.js.map +1 -0
  32. package/dist/cli/guide-template.d.ts.map +1 -1
  33. package/dist/cli/guide-template.js +3 -1
  34. package/dist/cli/guide-template.js.map +1 -1
  35. package/dist/cli/help.d.ts +5 -0
  36. package/dist/cli/help.d.ts.map +1 -0
  37. package/dist/cli/help.js +59 -0
  38. package/dist/cli/help.js.map +1 -0
  39. package/dist/cli/package-manager.d.ts +5 -0
  40. package/dist/cli/package-manager.d.ts.map +1 -0
  41. package/dist/cli/package-manager.js +34 -0
  42. package/dist/cli/package-manager.js.map +1 -0
  43. package/dist/cli/update.d.ts +8 -0
  44. package/dist/cli/update.d.ts.map +1 -0
  45. package/dist/cli/update.js +53 -0
  46. package/dist/cli/update.js.map +1 -0
  47. package/dist/commands/slash-command-adapters.d.ts +9 -0
  48. package/dist/commands/slash-command-adapters.d.ts.map +1 -0
  49. package/dist/commands/slash-command-adapters.js +116 -0
  50. package/dist/commands/slash-command-adapters.js.map +1 -0
  51. package/dist/data/component-props.d.ts +30 -0
  52. package/dist/data/component-props.d.ts.map +1 -0
  53. package/dist/data/component-props.js +537 -0
  54. package/dist/data/component-props.js.map +1 -0
  55. package/dist/data/component-registry.d.ts +30 -0
  56. package/dist/data/component-registry.d.ts.map +1 -0
  57. package/dist/data/component-registry.js +320 -0
  58. package/dist/data/component-registry.js.map +1 -0
  59. package/dist/data/examples/screen-examples.d.ts +38 -0
  60. package/dist/data/examples/screen-examples.d.ts.map +1 -0
  61. package/dist/data/examples/screen-examples.js +500 -0
  62. package/dist/data/examples/screen-examples.js.map +1 -0
  63. package/dist/index.js +130 -177
  64. package/dist/index.js.map +1 -1
  65. package/dist/prompts/doctor-workflow.js +1 -1
  66. package/dist/prompts/getting-started.d.ts.map +1 -1
  67. package/dist/prompts/getting-started.js +10 -9
  68. package/dist/prompts/getting-started.js.map +1 -1
  69. package/dist/prompts/screen-workflow.js +1 -1
  70. package/dist/schemas/mcp-schemas.d.ts +854 -739
  71. package/dist/schemas/mcp-schemas.d.ts.map +1 -1
  72. package/dist/schemas/mcp-schemas.js +32 -1
  73. package/dist/schemas/mcp-schemas.js.map +1 -1
  74. package/dist/tools/detect-project-context.d.ts +3 -1
  75. package/dist/tools/detect-project-context.d.ts.map +1 -1
  76. package/dist/tools/detect-project-context.js.map +1 -1
  77. package/dist/tools/get-screen-generation-context.d.ts +3 -1
  78. package/dist/tools/get-screen-generation-context.d.ts.map +1 -1
  79. package/dist/tools/get-screen-generation-context.js +2 -2
  80. package/dist/tools/get-screen-generation-context.js.map +1 -1
  81. package/dist/tools/list-screen-templates.d.ts +3 -1
  82. package/dist/tools/list-screen-templates.d.ts.map +1 -1
  83. package/dist/tools/list-screen-templates.js +3 -3
  84. package/dist/tools/list-screen-templates.js.map +1 -1
  85. package/dist/tools/preview-theme.d.ts +3 -1
  86. package/dist/tools/preview-theme.d.ts.map +1 -1
  87. package/dist/tools/preview-theme.js +28 -19
  88. package/dist/tools/preview-theme.js.map +1 -1
  89. package/dist/tools/validate-environment.d.ts +3 -1
  90. package/dist/tools/validate-environment.d.ts.map +1 -1
  91. package/dist/tools/validate-environment.js.map +1 -1
  92. package/dist/tools/whoami.d.ts.map +1 -1
  93. package/dist/tools/whoami.js +27 -17
  94. package/dist/tools/whoami.js.map +1 -1
  95. package/dist/utils/style-contract-reader.d.ts +10 -0
  96. package/dist/utils/style-contract-reader.d.ts.map +1 -0
  97. package/dist/utils/style-contract-reader.js +67 -0
  98. package/dist/utils/style-contract-reader.js.map +1 -0
  99. package/package.json +17 -16
  100. 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, templates, validation, and environment checks.
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
@@ -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
@@ -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;AAmBlD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAQjE;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,cAAc,GAAG,IAAI,CA4BnD;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,CAQ5C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAoBnE"}
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"}
@@ -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
- // Global authentication data cache
12
- const authCache = new MemoryCache();
13
- // Current authentication state
14
- let currentAuthData = null;
15
- let authStateExplicitlySet = false;
16
- // Raw API key (API 데이터 클라이언트에서 Bearer 헤더로 사용)
17
- let rawApiKey = null;
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
- currentAuthData = authData;
24
- authStateExplicitlySet = true;
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
- if (!rawApiKey) {
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
- currentAuthData = null;
90
- rawApiKey = null;
91
- authStateExplicitlySet = false;
92
- authCache.clear();
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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/auth/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/auth/state.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/auth/verify.ts"],"names":[],"mappings":"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"}
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;AAiC7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACjF,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,MAAM,iBAAiB,CAAC;IAE5C,IAAI,CAAC;QACH,IAAI,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;gBACjC,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,QAAQ,CAAC,gCAAgC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAEnF,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,wBAAwB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE;aACvF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;QAEvD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,QAAQ,CAAC,uBAAuB,IAAI,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAC;YAClE,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,oBAAoB;aAC1C,CAAC;QACJ,CAAC;QAED,IAAI,CACF,2CAA2C,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,WAAW,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,GAAG,CACnH,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtE,QAAQ,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;QAExD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,kBAAkB,YAAY,EAAE;SACxC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,cAA8B;IAC/D,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,cAAc,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,cAAqC;IACtF,QAAQ;IACR,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
@@ -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"}
@@ -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,3 @@
1
+ import type { UsageLedgerEntry } from './usage-ledger.js';
2
+ export declare function syncUsageEvent(entry: UsageLedgerEntry): Promise<void>;
3
+ //# sourceMappingURL=usage-sync.d.ts.map
@@ -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"}