stylemcp 0.1.0

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 (83) hide show
  1. package/README.md +261 -0
  2. package/action/action.yml +59 -0
  3. package/action/package.json +24 -0
  4. package/action/src/index.ts +455 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +335 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +10 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/rewriter/index.d.ts +45 -0
  14. package/dist/rewriter/index.d.ts.map +1 -0
  15. package/dist/rewriter/index.js +163 -0
  16. package/dist/rewriter/index.js.map +1 -0
  17. package/dist/schema/copy-patterns.d.ts +298 -0
  18. package/dist/schema/copy-patterns.d.ts.map +1 -0
  19. package/dist/schema/copy-patterns.js +53 -0
  20. package/dist/schema/copy-patterns.js.map +1 -0
  21. package/dist/schema/cta-rules.d.ts +274 -0
  22. package/dist/schema/cta-rules.d.ts.map +1 -0
  23. package/dist/schema/cta-rules.js +45 -0
  24. package/dist/schema/cta-rules.js.map +1 -0
  25. package/dist/schema/index.d.ts +2172 -0
  26. package/dist/schema/index.d.ts.map +1 -0
  27. package/dist/schema/index.js +92 -0
  28. package/dist/schema/index.js.map +1 -0
  29. package/dist/schema/tests.d.ts +274 -0
  30. package/dist/schema/tests.d.ts.map +1 -0
  31. package/dist/schema/tests.js +37 -0
  32. package/dist/schema/tests.js.map +1 -0
  33. package/dist/schema/tokens.d.ts +632 -0
  34. package/dist/schema/tokens.d.ts.map +1 -0
  35. package/dist/schema/tokens.js +68 -0
  36. package/dist/schema/tokens.js.map +1 -0
  37. package/dist/schema/voice.d.ts +280 -0
  38. package/dist/schema/voice.d.ts.map +1 -0
  39. package/dist/schema/voice.js +52 -0
  40. package/dist/schema/voice.js.map +1 -0
  41. package/dist/server/billing.d.ts +53 -0
  42. package/dist/server/billing.d.ts.map +1 -0
  43. package/dist/server/billing.js +216 -0
  44. package/dist/server/billing.js.map +1 -0
  45. package/dist/server/http.d.ts +5 -0
  46. package/dist/server/http.d.ts.map +1 -0
  47. package/dist/server/http.js +470 -0
  48. package/dist/server/http.js.map +1 -0
  49. package/dist/server/index.d.ts +3 -0
  50. package/dist/server/index.d.ts.map +1 -0
  51. package/dist/server/index.js +480 -0
  52. package/dist/server/index.js.map +1 -0
  53. package/dist/server/middleware/auth.d.ts +15 -0
  54. package/dist/server/middleware/auth.d.ts.map +1 -0
  55. package/dist/server/middleware/auth.js +83 -0
  56. package/dist/server/middleware/auth.js.map +1 -0
  57. package/dist/utils/pack-loader.d.ts +13 -0
  58. package/dist/utils/pack-loader.d.ts.map +1 -0
  59. package/dist/utils/pack-loader.js +98 -0
  60. package/dist/utils/pack-loader.js.map +1 -0
  61. package/dist/validator/index.d.ts +21 -0
  62. package/dist/validator/index.d.ts.map +1 -0
  63. package/dist/validator/index.js +60 -0
  64. package/dist/validator/index.js.map +1 -0
  65. package/dist/validator/rules/constraints.d.ts +8 -0
  66. package/dist/validator/rules/constraints.d.ts.map +1 -0
  67. package/dist/validator/rules/constraints.js +150 -0
  68. package/dist/validator/rules/constraints.js.map +1 -0
  69. package/dist/validator/rules/cta.d.ts +11 -0
  70. package/dist/validator/rules/cta.d.ts.map +1 -0
  71. package/dist/validator/rules/cta.js +113 -0
  72. package/dist/validator/rules/cta.js.map +1 -0
  73. package/dist/validator/rules/voice.d.ts +6 -0
  74. package/dist/validator/rules/voice.d.ts.map +1 -0
  75. package/dist/validator/rules/voice.js +106 -0
  76. package/dist/validator/rules/voice.js.map +1 -0
  77. package/package.json +61 -0
  78. package/packs/saas/copy_patterns.yaml +423 -0
  79. package/packs/saas/cta_rules.yaml +362 -0
  80. package/packs/saas/manifest.yaml +16 -0
  81. package/packs/saas/tests.yaml +305 -0
  82. package/packs/saas/tokens.json +226 -0
  83. package/packs/saas/voice.yaml +232 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/schema/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,280 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Voice schema - defines tone, vocabulary, and communication style
4
+ */
5
+ export declare const ToneAttributeSchema: z.ZodObject<{
6
+ name: z.ZodString;
7
+ weight: z.ZodDefault<z.ZodNumber>;
8
+ description: z.ZodOptional<z.ZodString>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ name: string;
11
+ weight: number;
12
+ description?: string | undefined;
13
+ }, {
14
+ name: string;
15
+ weight?: number | undefined;
16
+ description?: string | undefined;
17
+ }>;
18
+ export declare const VocabularyRuleSchema: z.ZodObject<{
19
+ preferred: z.ZodString;
20
+ avoid: z.ZodArray<z.ZodString, "many">;
21
+ context: z.ZodOptional<z.ZodString>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ preferred: string;
24
+ avoid: string[];
25
+ context?: string | undefined;
26
+ }, {
27
+ preferred: string;
28
+ avoid: string[];
29
+ context?: string | undefined;
30
+ }>;
31
+ export declare const DoNotSchema: z.ZodObject<{
32
+ pattern: z.ZodString;
33
+ isRegex: z.ZodDefault<z.ZodBoolean>;
34
+ reason: z.ZodString;
35
+ severity: z.ZodDefault<z.ZodEnum<["error", "warning", "info"]>>;
36
+ suggestion: z.ZodOptional<z.ZodString>;
37
+ }, "strip", z.ZodTypeAny, {
38
+ pattern: string;
39
+ isRegex: boolean;
40
+ reason: string;
41
+ severity: "error" | "warning" | "info";
42
+ suggestion?: string | undefined;
43
+ }, {
44
+ pattern: string;
45
+ reason: string;
46
+ isRegex?: boolean | undefined;
47
+ severity?: "error" | "warning" | "info" | undefined;
48
+ suggestion?: string | undefined;
49
+ }>;
50
+ export declare const ExampleSchema: z.ZodObject<{
51
+ bad: z.ZodString;
52
+ good: z.ZodString;
53
+ explanation: z.ZodOptional<z.ZodString>;
54
+ context: z.ZodOptional<z.ZodString>;
55
+ }, "strip", z.ZodTypeAny, {
56
+ bad: string;
57
+ good: string;
58
+ context?: string | undefined;
59
+ explanation?: string | undefined;
60
+ }, {
61
+ bad: string;
62
+ good: string;
63
+ context?: string | undefined;
64
+ explanation?: string | undefined;
65
+ }>;
66
+ export declare const VoiceSchema: z.ZodObject<{
67
+ version: z.ZodDefault<z.ZodString>;
68
+ name: z.ZodString;
69
+ description: z.ZodOptional<z.ZodString>;
70
+ tone: z.ZodObject<{
71
+ attributes: z.ZodArray<z.ZodObject<{
72
+ name: z.ZodString;
73
+ weight: z.ZodDefault<z.ZodNumber>;
74
+ description: z.ZodOptional<z.ZodString>;
75
+ }, "strip", z.ZodTypeAny, {
76
+ name: string;
77
+ weight: number;
78
+ description?: string | undefined;
79
+ }, {
80
+ name: string;
81
+ weight?: number | undefined;
82
+ description?: string | undefined;
83
+ }>, "many">;
84
+ summary: z.ZodOptional<z.ZodString>;
85
+ }, "strip", z.ZodTypeAny, {
86
+ attributes: {
87
+ name: string;
88
+ weight: number;
89
+ description?: string | undefined;
90
+ }[];
91
+ summary?: string | undefined;
92
+ }, {
93
+ attributes: {
94
+ name: string;
95
+ weight?: number | undefined;
96
+ description?: string | undefined;
97
+ }[];
98
+ summary?: string | undefined;
99
+ }>;
100
+ vocabulary: z.ZodObject<{
101
+ rules: z.ZodArray<z.ZodObject<{
102
+ preferred: z.ZodString;
103
+ avoid: z.ZodArray<z.ZodString, "many">;
104
+ context: z.ZodOptional<z.ZodString>;
105
+ }, "strip", z.ZodTypeAny, {
106
+ preferred: string;
107
+ avoid: string[];
108
+ context?: string | undefined;
109
+ }, {
110
+ preferred: string;
111
+ avoid: string[];
112
+ context?: string | undefined;
113
+ }>, "many">;
114
+ forbidden: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
115
+ encouraged: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
116
+ }, "strip", z.ZodTypeAny, {
117
+ rules: {
118
+ preferred: string;
119
+ avoid: string[];
120
+ context?: string | undefined;
121
+ }[];
122
+ forbidden: string[];
123
+ encouraged: string[];
124
+ }, {
125
+ rules: {
126
+ preferred: string;
127
+ avoid: string[];
128
+ context?: string | undefined;
129
+ }[];
130
+ forbidden?: string[] | undefined;
131
+ encouraged?: string[] | undefined;
132
+ }>;
133
+ doNot: z.ZodDefault<z.ZodArray<z.ZodObject<{
134
+ pattern: z.ZodString;
135
+ isRegex: z.ZodDefault<z.ZodBoolean>;
136
+ reason: z.ZodString;
137
+ severity: z.ZodDefault<z.ZodEnum<["error", "warning", "info"]>>;
138
+ suggestion: z.ZodOptional<z.ZodString>;
139
+ }, "strip", z.ZodTypeAny, {
140
+ pattern: string;
141
+ isRegex: boolean;
142
+ reason: string;
143
+ severity: "error" | "warning" | "info";
144
+ suggestion?: string | undefined;
145
+ }, {
146
+ pattern: string;
147
+ reason: string;
148
+ isRegex?: boolean | undefined;
149
+ severity?: "error" | "warning" | "info" | undefined;
150
+ suggestion?: string | undefined;
151
+ }>, "many">>;
152
+ examples: z.ZodDefault<z.ZodArray<z.ZodObject<{
153
+ bad: z.ZodString;
154
+ good: z.ZodString;
155
+ explanation: z.ZodOptional<z.ZodString>;
156
+ context: z.ZodOptional<z.ZodString>;
157
+ }, "strip", z.ZodTypeAny, {
158
+ bad: string;
159
+ good: string;
160
+ context?: string | undefined;
161
+ explanation?: string | undefined;
162
+ }, {
163
+ bad: string;
164
+ good: string;
165
+ context?: string | undefined;
166
+ explanation?: string | undefined;
167
+ }>, "many">>;
168
+ constraints: z.ZodDefault<z.ZodObject<{
169
+ maxSentenceLength: z.ZodOptional<z.ZodNumber>;
170
+ maxParagraphLength: z.ZodOptional<z.ZodNumber>;
171
+ readingLevel: z.ZodOptional<z.ZodEnum<["simple", "moderate", "technical"]>>;
172
+ personPov: z.ZodOptional<z.ZodEnum<["first-singular", "first-plural", "second", "third"]>>;
173
+ contractions: z.ZodDefault<z.ZodEnum<["required", "allowed", "forbidden"]>>;
174
+ oxfordComma: z.ZodDefault<z.ZodBoolean>;
175
+ }, "strip", z.ZodTypeAny, {
176
+ contractions: "forbidden" | "required" | "allowed";
177
+ oxfordComma: boolean;
178
+ maxSentenceLength?: number | undefined;
179
+ maxParagraphLength?: number | undefined;
180
+ readingLevel?: "simple" | "moderate" | "technical" | undefined;
181
+ personPov?: "first-singular" | "first-plural" | "second" | "third" | undefined;
182
+ }, {
183
+ maxSentenceLength?: number | undefined;
184
+ maxParagraphLength?: number | undefined;
185
+ readingLevel?: "simple" | "moderate" | "technical" | undefined;
186
+ personPov?: "first-singular" | "first-plural" | "second" | "third" | undefined;
187
+ contractions?: "forbidden" | "required" | "allowed" | undefined;
188
+ oxfordComma?: boolean | undefined;
189
+ }>>;
190
+ }, "strip", z.ZodTypeAny, {
191
+ name: string;
192
+ version: string;
193
+ tone: {
194
+ attributes: {
195
+ name: string;
196
+ weight: number;
197
+ description?: string | undefined;
198
+ }[];
199
+ summary?: string | undefined;
200
+ };
201
+ vocabulary: {
202
+ rules: {
203
+ preferred: string;
204
+ avoid: string[];
205
+ context?: string | undefined;
206
+ }[];
207
+ forbidden: string[];
208
+ encouraged: string[];
209
+ };
210
+ doNot: {
211
+ pattern: string;
212
+ isRegex: boolean;
213
+ reason: string;
214
+ severity: "error" | "warning" | "info";
215
+ suggestion?: string | undefined;
216
+ }[];
217
+ examples: {
218
+ bad: string;
219
+ good: string;
220
+ context?: string | undefined;
221
+ explanation?: string | undefined;
222
+ }[];
223
+ constraints: {
224
+ contractions: "forbidden" | "required" | "allowed";
225
+ oxfordComma: boolean;
226
+ maxSentenceLength?: number | undefined;
227
+ maxParagraphLength?: number | undefined;
228
+ readingLevel?: "simple" | "moderate" | "technical" | undefined;
229
+ personPov?: "first-singular" | "first-plural" | "second" | "third" | undefined;
230
+ };
231
+ description?: string | undefined;
232
+ }, {
233
+ name: string;
234
+ tone: {
235
+ attributes: {
236
+ name: string;
237
+ weight?: number | undefined;
238
+ description?: string | undefined;
239
+ }[];
240
+ summary?: string | undefined;
241
+ };
242
+ vocabulary: {
243
+ rules: {
244
+ preferred: string;
245
+ avoid: string[];
246
+ context?: string | undefined;
247
+ }[];
248
+ forbidden?: string[] | undefined;
249
+ encouraged?: string[] | undefined;
250
+ };
251
+ description?: string | undefined;
252
+ version?: string | undefined;
253
+ doNot?: {
254
+ pattern: string;
255
+ reason: string;
256
+ isRegex?: boolean | undefined;
257
+ severity?: "error" | "warning" | "info" | undefined;
258
+ suggestion?: string | undefined;
259
+ }[] | undefined;
260
+ examples?: {
261
+ bad: string;
262
+ good: string;
263
+ context?: string | undefined;
264
+ explanation?: string | undefined;
265
+ }[] | undefined;
266
+ constraints?: {
267
+ maxSentenceLength?: number | undefined;
268
+ maxParagraphLength?: number | undefined;
269
+ readingLevel?: "simple" | "moderate" | "technical" | undefined;
270
+ personPov?: "first-singular" | "first-plural" | "second" | "third" | undefined;
271
+ contractions?: "forbidden" | "required" | "allowed" | undefined;
272
+ oxfordComma?: boolean | undefined;
273
+ } | undefined;
274
+ }>;
275
+ export type ToneAttribute = z.infer<typeof ToneAttributeSchema>;
276
+ export type VocabularyRule = z.infer<typeof VocabularyRuleSchema>;
277
+ export type DoNot = z.infer<typeof DoNotSchema>;
278
+ export type Example = z.infer<typeof ExampleSchema>;
279
+ export type Voice = z.infer<typeof VoiceSchema>;
280
+ //# sourceMappingURL=voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../src/schema/voice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAI9B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAI/B,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;EAMtB,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;EAKxB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BtB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AACpD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Voice schema - defines tone, vocabulary, and communication style
4
+ */
5
+ export const ToneAttributeSchema = z.object({
6
+ name: z.string().describe('Attribute name, e.g., "professional", "friendly"'),
7
+ weight: z.number().min(0).max(1).default(0.5).describe('How strongly this attribute should be present (0-1)'),
8
+ description: z.string().optional().describe('What this tone means in practice'),
9
+ });
10
+ export const VocabularyRuleSchema = z.object({
11
+ preferred: z.string().describe('The preferred term'),
12
+ avoid: z.array(z.string()).describe('Terms to avoid in favor of preferred'),
13
+ context: z.string().optional().describe('When this rule applies'),
14
+ });
15
+ export const DoNotSchema = z.object({
16
+ pattern: z.string().describe('Pattern to match (string or regex)'),
17
+ isRegex: z.boolean().default(false).describe('Whether pattern is a regex'),
18
+ reason: z.string().describe('Why this should be avoided'),
19
+ severity: z.enum(['error', 'warning', 'info']).default('warning'),
20
+ suggestion: z.string().optional().describe('What to use instead'),
21
+ });
22
+ export const ExampleSchema = z.object({
23
+ bad: z.string().describe('Example of what NOT to write'),
24
+ good: z.string().describe('Example of what TO write'),
25
+ explanation: z.string().optional().describe('Why the good version is better'),
26
+ context: z.string().optional().describe('Where this example applies'),
27
+ });
28
+ export const VoiceSchema = z.object({
29
+ version: z.string().default('1.0').describe('Schema version'),
30
+ name: z.string().describe('Name of this voice profile'),
31
+ description: z.string().optional().describe('Description of this voice'),
32
+ tone: z.object({
33
+ attributes: z.array(ToneAttributeSchema).describe('Tone attributes with weights'),
34
+ summary: z.string().optional().describe('One-line summary of overall tone'),
35
+ }),
36
+ vocabulary: z.object({
37
+ rules: z.array(VocabularyRuleSchema).describe('Preferred vocabulary mappings'),
38
+ forbidden: z.array(z.string()).default([]).describe('Words/phrases that are never allowed'),
39
+ encouraged: z.array(z.string()).default([]).describe('Words/phrases to use when appropriate'),
40
+ }),
41
+ doNot: z.array(DoNotSchema).default([]).describe('Patterns and phrases to avoid'),
42
+ examples: z.array(ExampleSchema).default([]).describe('Before/after examples'),
43
+ constraints: z.object({
44
+ maxSentenceLength: z.number().optional().describe('Maximum words per sentence'),
45
+ maxParagraphLength: z.number().optional().describe('Maximum sentences per paragraph'),
46
+ readingLevel: z.enum(['simple', 'moderate', 'technical']).optional(),
47
+ personPov: z.enum(['first-singular', 'first-plural', 'second', 'third']).optional().describe('Preferred point of view'),
48
+ contractions: z.enum(['required', 'allowed', 'forbidden']).default('allowed'),
49
+ oxfordComma: z.boolean().default(true),
50
+ }).default({}),
51
+ });
52
+ //# sourceMappingURL=voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/schema/voice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { SupabaseClient } from '@supabase/supabase-js';
2
+ import Stripe from 'stripe';
3
+ export declare function getSupabase(): SupabaseClient;
4
+ export declare function getStripe(): Stripe;
5
+ export declare const TIERS: {
6
+ readonly free: {
7
+ readonly limit: 1000;
8
+ readonly price: 0;
9
+ };
10
+ readonly pro: {
11
+ readonly limit: 50000;
12
+ readonly price: 2900;
13
+ };
14
+ readonly team: {
15
+ readonly limit: 250000;
16
+ readonly price: 9900;
17
+ };
18
+ readonly enterprise: {
19
+ readonly limit: number;
20
+ readonly price: null;
21
+ };
22
+ };
23
+ export type Tier = keyof typeof TIERS;
24
+ export interface UserProfile {
25
+ id: string;
26
+ email: string;
27
+ tier: Tier;
28
+ api_key: string;
29
+ stripe_customer_id: string | null;
30
+ stripe_subscription_id: string | null;
31
+ monthly_request_limit: number;
32
+ }
33
+ export interface UsageStats {
34
+ tier: Tier;
35
+ limit: number;
36
+ used: number;
37
+ remaining: number;
38
+ reset_date: string;
39
+ }
40
+ export declare function validateApiKey(apiKey: string): Promise<UserProfile | null>;
41
+ export declare function checkQuota(userId: string): Promise<{
42
+ allowed: boolean;
43
+ stats: UsageStats;
44
+ }>;
45
+ export declare function recordUsage(userId: string, endpoint: string, method: string, statusCode: number, responseTimeMs: number): Promise<boolean>;
46
+ export declare function createCheckoutSession(userId: string, tier: 'pro' | 'team', successUrl: string, cancelUrl: string): Promise<string | null>;
47
+ export declare function handleStripeWebhook(payload: string | Buffer, signature: string): Promise<{
48
+ success: boolean;
49
+ error?: string;
50
+ }>;
51
+ export declare function createPortalSession(userId: string, returnUrl: string): Promise<string | null>;
52
+ export declare function isBillingEnabled(): boolean;
53
+ //# sourceMappingURL=billing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/server/billing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,MAAM,MAAM,QAAQ,CAAC;AAY5B,wBAAgB,WAAW,IAAI,cAAc,CAK5C;AAED,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAGD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;CAKR,CAAC;AAEX,MAAM,MAAM,IAAI,GAAG,MAAM,OAAO,KAAK,CAAC;AAGtC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAGD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAYhF;AAGD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC,CAwBjG;AAGD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAGD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,KAAK,GAAG,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsDxB;AAGD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+D/C;AAGD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB;AAGD,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C"}
@@ -0,0 +1,216 @@
1
+ import { createClient } from '@supabase/supabase-js';
2
+ import Stripe from 'stripe';
3
+ // Environment variables (set these in .env)
4
+ const SUPABASE_URL = process.env.SUPABASE_URL || '';
5
+ const SUPABASE_SERVICE_KEY = process.env.SUPABASE_SERVICE_KEY || '';
6
+ const STRIPE_SECRET_KEY = process.env.STRIPE_SECRET_KEY || '';
7
+ const STRIPE_WEBHOOK_SECRET = process.env.STRIPE_WEBHOOK_SECRET || '';
8
+ // Initialize clients
9
+ let supabase = null;
10
+ let stripe = null;
11
+ export function getSupabase() {
12
+ if (!supabase && SUPABASE_URL && SUPABASE_SERVICE_KEY) {
13
+ supabase = createClient(SUPABASE_URL, SUPABASE_SERVICE_KEY);
14
+ }
15
+ return supabase;
16
+ }
17
+ export function getStripe() {
18
+ if (!stripe && STRIPE_SECRET_KEY) {
19
+ stripe = new Stripe(STRIPE_SECRET_KEY, { apiVersion: '2023-10-16' });
20
+ }
21
+ return stripe;
22
+ }
23
+ // Tier configuration
24
+ export const TIERS = {
25
+ free: { limit: 1000, price: 0 },
26
+ pro: { limit: 50000, price: 2900 }, // $29.00 in cents
27
+ team: { limit: 250000, price: 9900 }, // $99.00 in cents
28
+ enterprise: { limit: Infinity, price: null }, // Custom pricing
29
+ };
30
+ // Validate API key and get user profile
31
+ export async function validateApiKey(apiKey) {
32
+ const db = getSupabase();
33
+ if (!db)
34
+ return null;
35
+ const { data, error } = await db
36
+ .from('profiles')
37
+ .select('*')
38
+ .eq('api_key', apiKey)
39
+ .single();
40
+ if (error || !data)
41
+ return null;
42
+ return data;
43
+ }
44
+ // Check if user has remaining quota
45
+ export async function checkQuota(userId) {
46
+ const db = getSupabase();
47
+ if (!db) {
48
+ return {
49
+ allowed: true,
50
+ stats: { tier: 'free', limit: 1000, used: 0, remaining: 1000, reset_date: '' }
51
+ };
52
+ }
53
+ const { data, error } = await db.rpc('get_usage_stats', { p_user_id: userId });
54
+ if (error) {
55
+ console.error('Error checking quota:', error);
56
+ return {
57
+ allowed: true,
58
+ stats: { tier: 'free', limit: 1000, used: 0, remaining: 1000, reset_date: '' }
59
+ };
60
+ }
61
+ const stats = data;
62
+ return {
63
+ allowed: stats.remaining > 0,
64
+ stats,
65
+ };
66
+ }
67
+ // Record API usage
68
+ export async function recordUsage(userId, endpoint, method, statusCode, responseTimeMs) {
69
+ const db = getSupabase();
70
+ if (!db)
71
+ return true;
72
+ const { data, error } = await db.rpc('increment_usage', {
73
+ p_user_id: userId,
74
+ p_endpoint: endpoint,
75
+ p_method: method,
76
+ p_status: statusCode,
77
+ p_time_ms: responseTimeMs,
78
+ });
79
+ if (error) {
80
+ console.error('Error recording usage:', error);
81
+ return true; // Don't block on logging errors
82
+ }
83
+ return data;
84
+ }
85
+ // Create Stripe checkout session
86
+ export async function createCheckoutSession(userId, tier, successUrl, cancelUrl) {
87
+ const stripeClient = getStripe();
88
+ const db = getSupabase();
89
+ if (!stripeClient || !db)
90
+ return null;
91
+ // Get or create Stripe customer
92
+ const { data: profile } = await db
93
+ .from('profiles')
94
+ .select('email, stripe_customer_id')
95
+ .eq('id', userId)
96
+ .single();
97
+ if (!profile)
98
+ return null;
99
+ let customerId = profile.stripe_customer_id;
100
+ if (!customerId) {
101
+ const customer = await stripeClient.customers.create({
102
+ email: profile.email,
103
+ metadata: { user_id: userId },
104
+ });
105
+ customerId = customer.id;
106
+ await db
107
+ .from('profiles')
108
+ .update({ stripe_customer_id: customerId })
109
+ .eq('id', userId);
110
+ }
111
+ // Create checkout session
112
+ const session = await stripeClient.checkout.sessions.create({
113
+ customer: customerId,
114
+ mode: 'subscription',
115
+ payment_method_types: ['card'],
116
+ line_items: [
117
+ {
118
+ price_data: {
119
+ currency: 'usd',
120
+ product_data: {
121
+ name: `StyleMCP ${tier.charAt(0).toUpperCase() + tier.slice(1)}`,
122
+ description: `${TIERS[tier].limit.toLocaleString()} API requests/month`,
123
+ },
124
+ unit_amount: TIERS[tier].price,
125
+ recurring: { interval: 'month' },
126
+ },
127
+ quantity: 1,
128
+ },
129
+ ],
130
+ success_url: successUrl,
131
+ cancel_url: cancelUrl,
132
+ metadata: { user_id: userId, tier },
133
+ });
134
+ return session.url;
135
+ }
136
+ // Handle Stripe webhook
137
+ export async function handleStripeWebhook(payload, signature) {
138
+ const stripeClient = getStripe();
139
+ const db = getSupabase();
140
+ if (!stripeClient || !db || !STRIPE_WEBHOOK_SECRET) {
141
+ return { success: false, error: 'Stripe not configured' };
142
+ }
143
+ let event;
144
+ try {
145
+ event = stripeClient.webhooks.constructEvent(payload, signature, STRIPE_WEBHOOK_SECRET);
146
+ }
147
+ catch (err) {
148
+ return { success: false, error: `Webhook signature verification failed` };
149
+ }
150
+ switch (event.type) {
151
+ case 'checkout.session.completed': {
152
+ const session = event.data.object;
153
+ const userId = session.metadata?.user_id;
154
+ const tier = session.metadata?.tier;
155
+ if (userId && tier) {
156
+ await db
157
+ .from('profiles')
158
+ .update({
159
+ tier,
160
+ stripe_subscription_id: session.subscription,
161
+ monthly_request_limit: TIERS[tier].limit,
162
+ updated_at: new Date().toISOString(),
163
+ })
164
+ .eq('id', userId);
165
+ }
166
+ break;
167
+ }
168
+ case 'customer.subscription.deleted': {
169
+ const subscription = event.data.object;
170
+ await db
171
+ .from('profiles')
172
+ .update({
173
+ tier: 'free',
174
+ stripe_subscription_id: null,
175
+ monthly_request_limit: TIERS.free.limit,
176
+ updated_at: new Date().toISOString(),
177
+ })
178
+ .eq('stripe_subscription_id', subscription.id);
179
+ break;
180
+ }
181
+ case 'customer.subscription.updated': {
182
+ const subscription = event.data.object;
183
+ // Handle plan changes, cancellation at period end, etc.
184
+ if (subscription.cancel_at_period_end) {
185
+ // Subscription will cancel at end of period - could notify user
186
+ console.log('Subscription will cancel:', subscription.id);
187
+ }
188
+ break;
189
+ }
190
+ }
191
+ return { success: true };
192
+ }
193
+ // Create customer portal session for managing subscription
194
+ export async function createPortalSession(userId, returnUrl) {
195
+ const stripeClient = getStripe();
196
+ const db = getSupabase();
197
+ if (!stripeClient || !db)
198
+ return null;
199
+ const { data: profile } = await db
200
+ .from('profiles')
201
+ .select('stripe_customer_id')
202
+ .eq('id', userId)
203
+ .single();
204
+ if (!profile?.stripe_customer_id)
205
+ return null;
206
+ const session = await stripeClient.billingPortal.sessions.create({
207
+ customer: profile.stripe_customer_id,
208
+ return_url: returnUrl,
209
+ });
210
+ return session.url;
211
+ }
212
+ // Check if billing is configured
213
+ export function isBillingEnabled() {
214
+ return !!(SUPABASE_URL && SUPABASE_SERVICE_KEY && STRIPE_SECRET_KEY);
215
+ }
216
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/server/billing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ declare const app: import("express-serve-static-core").Express;
3
+ export declare function startServer(port?: number): void;
4
+ export default app;
5
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":";AAkBA,QAAA,MAAM,GAAG,6CAAY,CAAC;AAoftB,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAa/C;AAOD,eAAe,GAAG,CAAC"}