ft-scout 1.0.9 → 1.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 (240) hide show
  1. package/.firebase/hosting.d2Vi.cache +9 -0
  2. package/.firebaserc +14 -0
  3. package/AUTONOMOUS_FEATURES.md +192 -0
  4. package/README.md +482 -29
  5. package/bin/ft.js +2 -0
  6. package/bin/src/commands/agent.d.ts.map +1 -0
  7. package/bin/src/commands/agent.js +1230 -0
  8. package/bin/src/commands/agent.js.map +1 -0
  9. package/bin/src/commands/audit.d.ts.map +1 -0
  10. package/bin/src/commands/audit.js +104 -0
  11. package/bin/src/commands/audit.js.map +1 -0
  12. package/bin/src/commands/authCommand.d.ts.map +1 -0
  13. package/bin/src/commands/authCommand.js +38 -0
  14. package/bin/src/commands/authCommand.js.map +1 -0
  15. package/bin/src/commands/benchmark.d.ts.map +1 -0
  16. package/bin/src/commands/benchmark.js +135 -0
  17. package/bin/src/commands/benchmark.js.map +1 -0
  18. package/bin/src/commands/brief.d.ts.map +1 -0
  19. package/bin/src/commands/brief.js +37 -0
  20. package/bin/src/commands/brief.js.map +1 -0
  21. package/bin/src/commands/configCommand.d.ts.map +1 -0
  22. package/bin/src/commands/configCommand.js +53 -0
  23. package/bin/src/commands/configCommand.js.map +1 -0
  24. package/bin/src/commands/dashboard.d.ts.map +1 -0
  25. package/bin/src/commands/dashboard.js +41 -0
  26. package/bin/src/commands/dashboard.js.map +1 -0
  27. package/bin/src/commands/history.d.ts.map +1 -0
  28. package/bin/src/commands/history.js +20 -0
  29. package/bin/src/commands/history.js.map +1 -0
  30. package/bin/src/commands/init.d.ts.map +1 -1
  31. package/bin/src/commands/init.js +408 -79
  32. package/bin/src/commands/init.js.map +1 -1
  33. package/bin/src/commands/login.d.ts.map +1 -0
  34. package/bin/src/commands/login.js +190 -0
  35. package/bin/src/commands/login.js.map +1 -0
  36. package/bin/src/commands/logout.d.ts.map +1 -0
  37. package/bin/src/commands/logout.js +15 -0
  38. package/bin/src/commands/logout.js.map +1 -0
  39. package/bin/src/commands/mcp.d.ts.map +1 -0
  40. package/bin/src/commands/mcp.js +393 -0
  41. package/bin/src/commands/mcp.js.map +1 -0
  42. package/bin/src/commands/owners.js +6 -6
  43. package/bin/src/commands/owners.js.map +1 -1
  44. package/bin/src/commands/plan.d.ts.map +1 -0
  45. package/bin/src/commands/plan.js +152 -0
  46. package/bin/src/commands/plan.js.map +1 -0
  47. package/bin/src/commands/quota.d.ts.map +1 -0
  48. package/bin/src/commands/quota.js +32 -0
  49. package/bin/src/commands/quota.js.map +1 -0
  50. package/bin/src/commands/recommend.d.ts.map +1 -0
  51. package/bin/src/commands/recommend.js +46 -0
  52. package/bin/src/commands/recommend.js.map +1 -0
  53. package/bin/src/commands/risky.d.ts.map +1 -1
  54. package/bin/src/commands/risky.js +235 -39
  55. package/bin/src/commands/risky.js.map +1 -1
  56. package/bin/src/commands/setup.d.ts.map +1 -1
  57. package/bin/src/commands/setup.js +411 -16
  58. package/bin/src/commands/setup.js.map +1 -1
  59. package/bin/src/commands/signup.d.ts.map +1 -0
  60. package/bin/src/commands/signup.js +118 -0
  61. package/bin/src/commands/signup.js.map +1 -0
  62. package/bin/src/commands/undo.d.ts.map +1 -0
  63. package/bin/src/commands/undo.js +59 -0
  64. package/bin/src/commands/undo.js.map +1 -0
  65. package/bin/src/commands/web.d.ts.map +1 -0
  66. package/bin/src/commands/web.js +90 -0
  67. package/bin/src/commands/web.js.map +1 -0
  68. package/bin/src/discovery/config.d.ts.map +1 -0
  69. package/bin/src/discovery/config.js +41 -0
  70. package/bin/src/discovery/config.js.map +1 -0
  71. package/bin/src/discovery/display.d.ts.map +1 -0
  72. package/bin/src/discovery/display.js +57 -0
  73. package/bin/src/discovery/display.js.map +1 -0
  74. package/bin/src/discovery/messages.d.ts.map +1 -0
  75. package/bin/src/discovery/messages.js +7 -0
  76. package/bin/src/discovery/messages.js.map +1 -0
  77. package/bin/src/discovery/signals.d.ts.map +1 -0
  78. package/bin/src/discovery/signals.js +33 -0
  79. package/bin/src/discovery/signals.js.map +1 -0
  80. package/bin/src/engine/actionVerifier.d.ts.map +1 -0
  81. package/bin/src/engine/actionVerifier.js +283 -0
  82. package/bin/src/engine/actionVerifier.js.map +1 -0
  83. package/bin/src/engine/agentEngine.d.ts.map +1 -0
  84. package/bin/src/engine/agentEngine.js +2188 -0
  85. package/bin/src/engine/agentEngine.js.map +1 -0
  86. package/bin/src/engine/agentState.d.ts.map +1 -0
  87. package/bin/src/engine/agentState.js +381 -0
  88. package/bin/src/engine/agentState.js.map +1 -0
  89. package/bin/src/engine/browser/browserController.d.ts.map +1 -0
  90. package/bin/src/engine/browser/browserController.js +737 -0
  91. package/bin/src/engine/browser/browserController.js.map +1 -0
  92. package/bin/src/engine/browser/index.d.ts.map +1 -0
  93. package/bin/src/engine/browser/index.js +2 -0
  94. package/bin/src/engine/browser/index.js.map +1 -0
  95. package/bin/src/engine/computer/computerController.d.ts.map +1 -0
  96. package/bin/src/engine/computer/computerController.js +773 -0
  97. package/bin/src/engine/computer/computerController.js.map +1 -0
  98. package/bin/src/engine/computer/computerDiagnostic.d.ts.map +1 -0
  99. package/bin/src/engine/computer/computerDiagnostic.js +71 -0
  100. package/bin/src/engine/computer/computerDiagnostic.js.map +1 -0
  101. package/bin/src/engine/computer/index.d.ts.map +1 -0
  102. package/bin/src/engine/computer/index.js +4 -0
  103. package/bin/src/engine/computer/index.js.map +1 -0
  104. package/bin/src/engine/computer/mockComputer.d.ts.map +1 -0
  105. package/bin/src/engine/computer/mockComputer.js +260 -0
  106. package/bin/src/engine/computer/mockComputer.js.map +1 -0
  107. package/bin/src/engine/computer/scoutDriver.cs +1161 -0
  108. package/bin/src/engine/computer/scout_driver.exe +0 -0
  109. package/bin/src/engine/git.d.ts.map +1 -1
  110. package/bin/src/engine/git.js +71 -0
  111. package/bin/src/engine/git.js.map +1 -1
  112. package/bin/src/engine/llm.d.ts.map +1 -1
  113. package/bin/src/engine/llm.js +1264 -35
  114. package/bin/src/engine/llm.js.map +1 -1
  115. package/bin/src/engine/planner.d.ts.map +1 -0
  116. package/bin/src/engine/planner.js +321 -0
  117. package/bin/src/engine/planner.js.map +1 -0
  118. package/bin/src/engine/runtime/agentRuntime.d.ts.map +1 -0
  119. package/bin/src/engine/runtime/agentRuntime.js +1258 -0
  120. package/bin/src/engine/runtime/agentRuntime.js.map +1 -0
  121. package/bin/src/engine/runtime/index.d.ts.map +1 -0
  122. package/bin/src/engine/runtime/index.js +2 -0
  123. package/bin/src/engine/runtime/index.js.map +1 -0
  124. package/bin/src/engine/safety.d.ts.map +1 -0
  125. package/bin/src/engine/safety.js +316 -0
  126. package/bin/src/engine/safety.js.map +1 -0
  127. package/bin/src/engine/scoutAudioRecorder.cs +215 -0
  128. package/bin/src/engine/scout_audio_recorder.exe +0 -0
  129. package/bin/src/engine/toolRegistry.d.ts.map +1 -0
  130. package/bin/src/engine/toolRegistry.js +521 -0
  131. package/bin/src/engine/toolRegistry.js.map +1 -0
  132. package/bin/src/engine/verifier.d.ts.map +1 -0
  133. package/bin/src/engine/verifier.js +414 -0
  134. package/bin/src/engine/verifier.js.map +1 -0
  135. package/bin/src/engine/voiceEngine.d.ts.map +1 -0
  136. package/bin/src/engine/voiceEngine.js +474 -0
  137. package/bin/src/engine/voiceEngine.js.map +1 -0
  138. package/bin/src/engine/web.d.ts.map +1 -0
  139. package/bin/src/engine/web.js +161 -0
  140. package/bin/src/engine/web.js.map +1 -0
  141. package/bin/src/engine/workspace/agentWorkspace.d.ts.map +1 -0
  142. package/bin/src/engine/workspace/agentWorkspace.js +505 -0
  143. package/bin/src/engine/workspace/agentWorkspace.js.map +1 -0
  144. package/bin/src/engine/workspace/index.d.ts.map +1 -0
  145. package/bin/src/engine/workspace/index.js +2 -0
  146. package/bin/src/engine/workspace/index.js.map +1 -0
  147. package/bin/src/index.js +369 -19
  148. package/bin/src/index.js.map +1 -1
  149. package/bin/src/mcp/client.d.ts.map +1 -0
  150. package/bin/src/mcp/client.js +127 -0
  151. package/bin/src/mcp/client.js.map +1 -0
  152. package/bin/src/mcp/discovery.d.ts.map +1 -0
  153. package/bin/src/mcp/discovery.js +91 -0
  154. package/bin/src/mcp/discovery.js.map +1 -0
  155. package/bin/src/mcp/health.d.ts.map +1 -0
  156. package/bin/src/mcp/health.js +44 -0
  157. package/bin/src/mcp/health.js.map +1 -0
  158. package/bin/src/mcp/index.d.ts.map +1 -0
  159. package/bin/src/mcp/index.js +15 -0
  160. package/bin/src/mcp/index.js.map +1 -0
  161. package/bin/src/mcp/manager.d.ts.map +1 -0
  162. package/bin/src/mcp/manager.js +648 -0
  163. package/bin/src/mcp/manager.js.map +1 -0
  164. package/bin/src/mcp/permissions.d.ts.map +1 -0
  165. package/bin/src/mcp/permissions.js +50 -0
  166. package/bin/src/mcp/permissions.js.map +1 -0
  167. package/bin/src/mcp/persistence.d.ts.map +1 -0
  168. package/bin/src/mcp/persistence.js +171 -0
  169. package/bin/src/mcp/persistence.js.map +1 -0
  170. package/bin/src/mcp/recovery.d.ts.map +1 -0
  171. package/bin/src/mcp/recovery.js +75 -0
  172. package/bin/src/mcp/recovery.js.map +1 -0
  173. package/bin/src/mcp/telemetry.d.ts.map +1 -0
  174. package/bin/src/mcp/telemetry.js +82 -0
  175. package/bin/src/mcp/telemetry.js.map +1 -0
  176. package/bin/src/mcp/toolRouter.d.ts.map +1 -0
  177. package/bin/src/mcp/toolRouter.js +127 -0
  178. package/bin/src/mcp/toolRouter.js.map +1 -0
  179. package/bin/src/mcp/transport.d.ts.map +1 -0
  180. package/bin/src/mcp/transport.js +328 -0
  181. package/bin/src/mcp/transport.js.map +1 -0
  182. package/bin/src/mcp/types.d.ts.map +1 -0
  183. package/bin/src/mcp/types.js +6 -0
  184. package/bin/src/mcp/types.js.map +1 -0
  185. package/bin/src/server/server.d.ts.map +1 -0
  186. package/bin/src/server/server.js +989 -0
  187. package/bin/src/server/server.js.map +1 -0
  188. package/bin/src/utils/admin.d.ts.map +1 -0
  189. package/bin/src/utils/admin.js +231 -0
  190. package/bin/src/utils/admin.js.map +1 -0
  191. package/bin/src/utils/auditLogger.d.ts.map +1 -0
  192. package/bin/src/utils/auditLogger.js +70 -0
  193. package/bin/src/utils/auditLogger.js.map +1 -0
  194. package/bin/src/utils/auth.d.ts.map +1 -0
  195. package/bin/src/utils/auth.js +679 -0
  196. package/bin/src/utils/auth.js.map +1 -0
  197. package/bin/src/utils/branding.d.ts.map +1 -0
  198. package/bin/src/utils/branding.js +14 -0
  199. package/bin/src/utils/branding.js.map +1 -0
  200. package/bin/src/utils/config.d.ts.map +1 -1
  201. package/bin/src/utils/config.js +124 -3
  202. package/bin/src/utils/config.js.map +1 -1
  203. package/bin/src/utils/email.d.ts.map +1 -0
  204. package/bin/src/utils/email.js +267 -0
  205. package/bin/src/utils/email.js.map +1 -0
  206. package/bin/src/utils/firebaseAuth.d.ts.map +1 -0
  207. package/bin/src/utils/firebaseAuth.js +174 -0
  208. package/bin/src/utils/firebaseAuth.js.map +1 -0
  209. package/bin/src/utils/holoseneAuth.d.ts.map +1 -0
  210. package/bin/src/utils/holoseneAuth.js +307 -0
  211. package/bin/src/utils/holoseneAuth.js.map +1 -0
  212. package/bin/src/utils/language.d.ts.map +1 -0
  213. package/bin/src/utils/language.js +181 -0
  214. package/bin/src/utils/language.js.map +1 -0
  215. package/bin/src/utils/markdown.d.ts.map +1 -0
  216. package/bin/src/utils/markdown.js +215 -0
  217. package/bin/src/utils/markdown.js.map +1 -0
  218. package/bin/src/utils/payment.d.ts.map +1 -0
  219. package/bin/src/utils/payment.js +290 -0
  220. package/bin/src/utils/payment.js.map +1 -0
  221. package/bin/src/utils/pricing.d.ts.map +1 -0
  222. package/bin/src/utils/pricing.js +165 -0
  223. package/bin/src/utils/pricing.js.map +1 -0
  224. package/bin/src/utils/razorpay.d.ts.map +1 -0
  225. package/bin/src/utils/razorpay.js +144 -0
  226. package/bin/src/utils/razorpay.js.map +1 -0
  227. package/bin/src/utils/session.d.ts.map +1 -0
  228. package/bin/src/utils/session.js +82 -0
  229. package/bin/src/utils/session.js.map +1 -0
  230. package/bin/src/utils/updateCheck.d.ts.map +1 -0
  231. package/bin/src/utils/updateCheck.js +108 -0
  232. package/bin/src/utils/updateCheck.js.map +1 -0
  233. package/downloads/invoice-2026-03.pdf +1 -0
  234. package/firebase.json +74 -0
  235. package/package.json +49 -46
  236. package/web/ScoutFavicon.png +0 -0
  237. package/web/app.js +3944 -0
  238. package/web/styles.css +3081 -0
  239. package/.ft/context.json +0 -17
  240. package/email-template.txt +0 -44
@@ -0,0 +1,290 @@
1
+ import crypto from 'crypto';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import dotenv from 'dotenv';
5
+ import { loadAuthConfig, saveAuthConfig, TIER_RANK } from './auth.js';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ dotenv.config({ path: path.resolve(__dirname, '../../../.env'), quiet: true });
9
+ dotenv.config({ quiet: true });
10
+ import { getPricingConfig } from './pricing.js';
11
+ export function getActivePlanConfigs() {
12
+ const dynamic = getPricingConfig();
13
+ const result = {};
14
+ for (const key of ['free', 'pro', 'enterprise']) {
15
+ const d = dynamic[key];
16
+ const isOffer = Boolean(d.offerActive && d.offerPriceINR !== undefined);
17
+ result[key] = {
18
+ id: key,
19
+ name: d.name,
20
+ monthlyPrice: isOffer && d.offerPriceUSD !== undefined ? d.offerPriceUSD : d.monthlyPriceUSD,
21
+ annualPrice: d.annualPriceUSD,
22
+ monthlyPriceINR: isOffer ? d.offerPriceINR : d.monthlyPriceINR,
23
+ annualPriceINR: d.annualPriceINR,
24
+ credits: d.credits,
25
+ description: d.description,
26
+ features: d.features,
27
+ offerActive: d.offerActive,
28
+ offerBadge: d.offerBadge,
29
+ offerBannerText: d.offerBannerText,
30
+ originalMonthlyPriceINR: d.monthlyPriceINR,
31
+ originalMonthlyPriceUSD: d.monthlyPriceUSD,
32
+ };
33
+ }
34
+ return result;
35
+ }
36
+ export const PLAN_CONFIGS = new Proxy({}, {
37
+ get(_target, prop) {
38
+ return getActivePlanConfigs()[prop];
39
+ },
40
+ ownKeys() {
41
+ return Object.keys(getActivePlanConfigs());
42
+ },
43
+ getOwnPropertyDescriptor(_target, prop) {
44
+ return {
45
+ enumerable: true,
46
+ configurable: true,
47
+ value: getActivePlanConfigs()[prop],
48
+ };
49
+ },
50
+ });
51
+ export function getPayPalBaseUrl() {
52
+ return process.env.PAYPAL_MODE === 'live'
53
+ ? 'https://api-m.paypal.com'
54
+ : 'https://api-m.sandbox.paypal.com';
55
+ }
56
+ export async function getPayPalAccessToken() {
57
+ const clientId = process.env.PAYPAL_CLIENT_ID;
58
+ const clientSecret = process.env.PAYPAL_CLIENT_SECRET;
59
+ if (!clientId || !clientSecret) {
60
+ throw new Error('PAYPAL_CLIENT_ID and PAYPAL_CLIENT_SECRET must be configured in environment variables.');
61
+ }
62
+ const auth = Buffer.from(`${clientId}:${clientSecret}`).toString('base64');
63
+ const baseUrl = getPayPalBaseUrl();
64
+ const response = await fetch(`${baseUrl}/v1/oauth2/token`, {
65
+ method: 'POST',
66
+ headers: {
67
+ 'Authorization': `Basic ${auth}`,
68
+ 'Content-Type': 'application/x-www-form-urlencoded',
69
+ },
70
+ body: 'grant_type=client_credentials',
71
+ });
72
+ const data = await safeJsonParse(response, 'PayPal OAuth token');
73
+ if (!response.ok || !data.access_token) {
74
+ throw new Error(`PayPal OAuth failed: ${data.error_description || data.error || 'Unable to retrieve access token'}`);
75
+ }
76
+ return data.access_token;
77
+ }
78
+ async function safeJsonParse(res, endpointLabel) {
79
+ const text = await res.text();
80
+ try {
81
+ return JSON.parse(text);
82
+ }
83
+ catch {
84
+ const preview = text.trim().replace(/\s+/g, ' ').slice(0, 150);
85
+ throw new Error(`PayPal API returned non-JSON response from ${endpointLabel} (HTTP ${res.status} ${res.statusText}): ${preview}`);
86
+ }
87
+ }
88
+ export function getPaymentProvider() {
89
+ return 'paypal';
90
+ }
91
+ export function getPublicPaymentConfig() {
92
+ const isLive = process.env.PAYPAL_MODE === 'live';
93
+ const hasPayPalKeys = Boolean(process.env.PAYPAL_CLIENT_ID && process.env.PAYPAL_CLIENT_SECRET);
94
+ return {
95
+ provider: 'paypal',
96
+ isSandbox: !isLive || !hasPayPalKeys,
97
+ paypalClientId: process.env.PAYPAL_CLIENT_ID || undefined,
98
+ razorpayKeyId: process.env.RAZORPAY_KEY_ID || undefined,
99
+ plans: getActivePlanConfigs(),
100
+ };
101
+ }
102
+ /**
103
+ * Creates a checkout order strictly with PayPal.
104
+ */
105
+ export async function createCheckoutSession(params) {
106
+ const tier = params.tier;
107
+ if (tier === 'free') {
108
+ throw new Error('Cannot create a payment session for the free tier.');
109
+ }
110
+ const auth = loadAuthConfig();
111
+ const currentTier = (auth.currentTier || 'free').toLowerCase();
112
+ const currentRank = TIER_RANK[currentTier] ?? 0;
113
+ const targetRank = TIER_RANK[tier] ?? 0;
114
+ if (currentRank > 0 && targetRank <= currentRank) {
115
+ throw new Error(`Downgrading paid plans is not allowed. Your ${currentTier.toUpperCase()} plan will automatically shift to the free tier upon its expiration date.`);
116
+ }
117
+ const plans = getActivePlanConfigs();
118
+ const plan = plans[tier];
119
+ if (!plan) {
120
+ throw new Error(`Unknown tier: ${tier}`);
121
+ }
122
+ const billingCycle = params.billingCycle === 'annual' ? 'annual' : 'monthly';
123
+ const unitPrice = billingCycle === 'annual' ? plan.annualPrice * 12 : plan.monthlyPrice;
124
+ const DEFAULT_PLANS_URL = process.env.FRONTTERRAIN_DASHBOARD_URL
125
+ ? `${process.env.FRONTTERRAIN_DASHBOARD_URL.replace(/\/$/, '')}/plans`
126
+ : 'https://scout.frontterrain.com/plans';
127
+ const accessToken = await getPayPalAccessToken();
128
+ const baseUrl = getPayPalBaseUrl();
129
+ const returnUrl = params.returnUrl || DEFAULT_PLANS_URL;
130
+ const successReturnUrl = `${returnUrl}${returnUrl.includes('?') ? '&' : '?'}success=true&tier=${tier}`;
131
+ const cancelReturnUrl = params.cancelUrl || `${returnUrl}${returnUrl.includes('?') ? '&' : '?'}canceled=true`;
132
+ const orderPayload = {
133
+ intent: 'CAPTURE',
134
+ purchase_units: [
135
+ {
136
+ reference_id: `scout_${tier}_${Date.now()}`,
137
+ description: `FrontTerrain Scout ${plan.name} (${billingCycle})`,
138
+ amount: {
139
+ currency_code: 'USD',
140
+ value: unitPrice.toFixed(2),
141
+ },
142
+ },
143
+ ],
144
+ application_context: {
145
+ brand_name: 'FrontTerrain Scout',
146
+ landing_page: 'BILLING',
147
+ user_action: 'PAY_NOW',
148
+ return_url: successReturnUrl,
149
+ cancel_url: cancelReturnUrl,
150
+ },
151
+ };
152
+ const orderRes = await fetch(`${baseUrl}/v2/checkout/orders`, {
153
+ method: 'POST',
154
+ headers: {
155
+ 'Authorization': `Bearer ${accessToken}`,
156
+ 'Content-Type': 'application/json',
157
+ },
158
+ body: JSON.stringify(orderPayload),
159
+ });
160
+ const orderData = await safeJsonParse(orderRes, 'PayPal create order');
161
+ if (!orderRes.ok || !orderData.id) {
162
+ throw new Error(`PayPal Order Creation Failed: ${orderData.message || JSON.stringify(orderData)}`);
163
+ }
164
+ const approveLink = orderData.links?.find((l) => l.rel === 'approve')?.href;
165
+ if (!approveLink) {
166
+ throw new Error('PayPal did not return an approval URL for this order.');
167
+ }
168
+ return {
169
+ success: true,
170
+ provider: 'paypal',
171
+ sessionId: orderData.id,
172
+ orderId: orderData.id,
173
+ checkoutUrl: approveLink,
174
+ amount: unitPrice,
175
+ currency: 'USD',
176
+ tier,
177
+ billingCycle,
178
+ isSandbox: process.env.PAYPAL_MODE !== 'live',
179
+ };
180
+ }
181
+ /**
182
+ * Strictly verifies the PayPal transaction using PayPal REST API.
183
+ * Validates order status, currency, and paid amount against the requested plan.
184
+ * Absolutely no simulation or fake tokens allowed.
185
+ */
186
+ export async function verifyAndApplyUpgrade(params) {
187
+ const targetOrderId = (params.orderId || params.token || params.sessionId || '').trim();
188
+ const tier = params.tier;
189
+ if (!targetOrderId) {
190
+ throw new Error('PayPal payment verification failed: Missing order ID or payment token.');
191
+ }
192
+ const plans = getActivePlanConfigs();
193
+ const plan = plans[tier];
194
+ if (!plan || tier === 'free') {
195
+ throw new Error(`Invalid plan tier specified for upgrade: ${tier}`);
196
+ }
197
+ const currentConfig = loadAuthConfig();
198
+ const currentTier = (currentConfig.currentTier || 'free').toLowerCase();
199
+ const currentRank = TIER_RANK[currentTier] ?? 0;
200
+ const targetRank = TIER_RANK[tier] ?? 0;
201
+ if (currentRank > 0 && targetRank < currentRank) {
202
+ throw new Error(`Downgrading from ${currentTier.toUpperCase()} to ${tier.toUpperCase()} is not allowed. Your active plan will automatically shift to the free tier upon its expiration date.`);
203
+ }
204
+ const billingCycle = params.billingCycle === 'annual' ? 'annual' : 'monthly';
205
+ const expectedPrice = billingCycle === 'annual' ? plan.annualPrice * 12 : plan.monthlyPrice;
206
+ // Strict verification against real PayPal API
207
+ const accessToken = await getPayPalAccessToken();
208
+ const baseUrl = getPayPalBaseUrl();
209
+ let orderData = null;
210
+ let transactionId = '';
211
+ // Step 1: Attempt to capture the PayPal order
212
+ const captureRes = await fetch(`${baseUrl}/v2/checkout/orders/${encodeURIComponent(targetOrderId)}/capture`, {
213
+ method: 'POST',
214
+ headers: {
215
+ 'Authorization': `Bearer ${accessToken}`,
216
+ 'Content-Type': 'application/json',
217
+ },
218
+ });
219
+ const captureJson = await safeJsonParse(captureRes, 'PayPal capture order');
220
+ if (captureRes.ok && (captureJson.status === 'COMPLETED' || captureJson.status === 'SAVED')) {
221
+ orderData = captureJson;
222
+ const captureUnit = captureJson.purchase_units?.[0]?.payments?.captures?.[0];
223
+ transactionId = captureUnit?.id || captureJson.id;
224
+ }
225
+ else if (captureJson.status === 'COMPLETED' ||
226
+ captureJson.name === 'UNPROCESSABLE_ENTITY' ||
227
+ captureJson.details?.some((d) => d.issue === 'ORDER_ALREADY_CAPTURED')) {
228
+ // Step 2: If order was already captured, fetch order details to verify
229
+ const getRes = await fetch(`${baseUrl}/v2/checkout/orders/${encodeURIComponent(targetOrderId)}`, {
230
+ method: 'GET',
231
+ headers: {
232
+ 'Authorization': `Bearer ${accessToken}`,
233
+ 'Content-Type': 'application/json',
234
+ },
235
+ });
236
+ const getJson = await safeJsonParse(getRes, 'PayPal get order');
237
+ if (getRes.ok && getJson.status === 'COMPLETED') {
238
+ orderData = getJson;
239
+ const captureUnit = getJson.purchase_units?.[0]?.payments?.captures?.[0];
240
+ transactionId = captureUnit?.id || getJson.id;
241
+ }
242
+ else {
243
+ throw new Error(`PayPal Order Verification Failed: Order status is "${getJson.status || 'UNKNOWN'}" (must be COMPLETED).`);
244
+ }
245
+ }
246
+ else {
247
+ const errorMsg = captureJson.message || captureJson.details?.[0]?.description || JSON.stringify(captureJson);
248
+ throw new Error(`PayPal capture failed: ${errorMsg}`);
249
+ }
250
+ // Step 3: Strict verification of amount, currency, and purchase details
251
+ if (!orderData || orderData.status !== 'COMPLETED') {
252
+ throw new Error(`PayPal payment verification rejected: Order status is ${orderData?.status || 'INCOMPLETE'}.`);
253
+ }
254
+ const purchaseUnit = orderData.purchase_units?.[0];
255
+ const captureInfo = purchaseUnit?.payments?.captures?.[0];
256
+ const paidCurrency = captureInfo?.amount?.currency_code || purchaseUnit?.amount?.currency_code;
257
+ const paidAmount = parseFloat(captureInfo?.amount?.value || purchaseUnit?.amount?.value || '0');
258
+ if (paidCurrency !== 'USD') {
259
+ throw new Error(`PayPal payment verification rejected: Expected currency USD, received ${paidCurrency}.`);
260
+ }
261
+ // Allow a small 0.01 tolerance for floating point representations
262
+ if (paidAmount < expectedPrice - 0.01) {
263
+ throw new Error(`PayPal payment verification rejected: Paid amount ($${paidAmount.toFixed(2)}) does not match required plan price ($${expectedPrice.toFixed(2)}).`);
264
+ }
265
+ // Step 4: Apply verified upgrade to local auth config
266
+ const config = loadAuthConfig();
267
+ const now = new Date();
268
+ const renewalDate = new Date(now);
269
+ renewalDate.setMonth(renewalDate.getMonth() + (billingCycle === 'annual' ? 12 : 1));
270
+ const updatedConfig = {
271
+ ...config,
272
+ currentTier: tier,
273
+ creditsTotal: plan.credits,
274
+ creditsUsed: 0, // Reset used credits upon verified purchase
275
+ resetCredits: true,
276
+ transactionId,
277
+ renewAt: renewalDate.toISOString(),
278
+ };
279
+ saveAuthConfig(updatedConfig);
280
+ return {
281
+ success: true,
282
+ tier,
283
+ creditsAdded: plan.credits,
284
+ totalCredits: plan.credits,
285
+ renewAt: renewalDate.toISOString(),
286
+ auth: updatedConfig,
287
+ transactionId: transactionId || targetOrderId,
288
+ };
289
+ }
290
+ //# sourceMappingURL=payment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.js","sourceRoot":"","sources":["payment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["pricing.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;AACrD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAKD,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAqEtE,CAAC;AAQF,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAoBtE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CA+CtH;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAcxG;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAE5E"}
@@ -0,0 +1,165 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ const PRICING_DIR = path.join(os.homedir(), '.ft');
5
+ const PRICING_FILE = path.join(PRICING_DIR, 'pricing.json');
6
+ export const DEFAULT_PRICING_CONFIG = {
7
+ free: {
8
+ id: 'free',
9
+ name: 'Developer Free',
10
+ monthlyPriceINR: 0,
11
+ annualPriceINR: 0,
12
+ monthlyPriceUSD: 0,
13
+ annualPriceUSD: 0,
14
+ credits: 100,
15
+ description: 'Essential tools for individual developer workflow',
16
+ features: [
17
+ '100 AI credits / month',
18
+ 'Full Scout CLI core features',
19
+ '1 Active CLI session slot',
20
+ 'Single-use authorization tokens',
21
+ 'Community support & docs',
22
+ ],
23
+ offerActive: false,
24
+ },
25
+ pro: {
26
+ id: 'pro',
27
+ name: 'Pro Developer',
28
+ monthlyPriceINR: 50, // ₹50 as requested by user
29
+ annualPriceINR: 45,
30
+ monthlyPriceUSD: 0.99,
31
+ annualPriceUSD: 0.79,
32
+ credits: 1000,
33
+ description: 'High-power AI co-pilot capabilities, priority quota & live visual HUD',
34
+ popular: true,
35
+ badge: 'POPULAR',
36
+ features: [
37
+ '1,000 AI credits / month',
38
+ 'Unlimited AI co-pilot queries',
39
+ 'Up to 5 Active CLI Sessions',
40
+ 'Visual Perception HUD',
41
+ 'Fast-track model response engine',
42
+ 'Priority token revocation & audit logs',
43
+ 'Direct email support response',
44
+ ],
45
+ offerActive: false,
46
+ offerPriceINR: 49,
47
+ offerPriceUSD: 0.49,
48
+ offerBadge: 'SPECIAL OFFER',
49
+ offerBannerText: '🔥 Limited Time Offer: Get Pro for just ₹49/mo!',
50
+ },
51
+ enterprise: {
52
+ id: 'enterprise',
53
+ name: 'Team & Enterprise',
54
+ monthlyPriceINR: 3999,
55
+ annualPriceINR: 37990,
56
+ monthlyPriceUSD: 49,
57
+ annualPriceUSD: 39,
58
+ credits: 10000,
59
+ description: 'Organization controls, security policies & dedicated scale',
60
+ features: [
61
+ '10,000 AI credits / month',
62
+ 'Multi-seat organization access',
63
+ 'Unlimited CLI Session connections',
64
+ 'Window Isolation & Multi-App Vision Engine',
65
+ 'Custom security token policies',
66
+ 'Dedicated account SLA support',
67
+ '24/7 SLA Priority response',
68
+ ],
69
+ offerActive: false,
70
+ offerPriceINR: 2999,
71
+ offerPriceUSD: 35,
72
+ offerBadge: 'ENTERPRISE DEAL',
73
+ offerBannerText: '💼 Enterprise Special: Flat ₹2,999/mo for team onboarding!',
74
+ },
75
+ };
76
+ function ensurePricingDir() {
77
+ if (!fs.existsSync(PRICING_DIR)) {
78
+ fs.mkdirSync(PRICING_DIR, { recursive: true });
79
+ }
80
+ }
81
+ export function getPricingConfig() {
82
+ try {
83
+ if (fs.existsSync(PRICING_FILE)) {
84
+ const raw = fs.readFileSync(PRICING_FILE, 'utf-8');
85
+ const parsed = JSON.parse(raw);
86
+ if (parsed && typeof parsed === 'object' && parsed.pro && parsed.free) {
87
+ return {
88
+ free: { ...DEFAULT_PRICING_CONFIG.free, ...parsed.free },
89
+ pro: { ...DEFAULT_PRICING_CONFIG.pro, ...parsed.pro },
90
+ enterprise: { ...DEFAULT_PRICING_CONFIG.enterprise, ...parsed.enterprise },
91
+ };
92
+ }
93
+ }
94
+ }
95
+ catch (err) {
96
+ console.warn('[Pricing Engine] Error reading pricing file, using default configuration:', err);
97
+ }
98
+ // Auto-initialize file if it doesn't exist
99
+ saveFullPricingConfig(DEFAULT_PRICING_CONFIG);
100
+ return { ...DEFAULT_PRICING_CONFIG };
101
+ }
102
+ export function saveFullPricingConfig(config) {
103
+ ensurePricingDir();
104
+ const cleanConfig = {
105
+ free: {
106
+ ...DEFAULT_PRICING_CONFIG.free,
107
+ ...config.free,
108
+ id: 'free',
109
+ monthlyPriceINR: 0,
110
+ annualPriceINR: 0,
111
+ monthlyPriceUSD: 0,
112
+ annualPriceUSD: 0,
113
+ offerActive: Boolean(config.free?.offerActive),
114
+ },
115
+ pro: {
116
+ ...DEFAULT_PRICING_CONFIG.pro,
117
+ ...config.pro,
118
+ id: 'pro',
119
+ monthlyPriceINR: Math.max(0, Number(config.pro?.monthlyPriceINR ?? 50)),
120
+ annualPriceINR: Math.max(0, Number(config.pro?.annualPriceINR ?? 45)),
121
+ monthlyPriceUSD: Math.max(0, Number(config.pro?.monthlyPriceUSD ?? 0.99)),
122
+ annualPriceUSD: Math.max(0, Number(config.pro?.annualPriceUSD ?? 0.79)),
123
+ credits: Math.max(100, Number(config.pro?.credits ?? 1000)),
124
+ offerActive: Boolean(config.pro?.offerActive),
125
+ offerPriceINR: config.pro?.offerPriceINR !== undefined ? Number(config.pro.offerPriceINR) : undefined,
126
+ offerPriceUSD: config.pro?.offerPriceUSD !== undefined ? Number(config.pro.offerPriceUSD) : undefined,
127
+ offerBadge: config.pro?.offerBadge || 'SPECIAL OFFER',
128
+ offerBannerText: config.pro?.offerBannerText || '',
129
+ },
130
+ enterprise: {
131
+ ...DEFAULT_PRICING_CONFIG.enterprise,
132
+ ...config.enterprise,
133
+ id: 'enterprise',
134
+ monthlyPriceINR: Math.max(0, Number(config.enterprise?.monthlyPriceINR ?? 3999)),
135
+ annualPriceINR: Math.max(0, Number(config.enterprise?.annualPriceINR ?? 37990)),
136
+ monthlyPriceUSD: Math.max(0, Number(config.enterprise?.monthlyPriceUSD ?? 49)),
137
+ annualPriceUSD: Math.max(0, Number(config.enterprise?.annualPriceUSD ?? 39)),
138
+ credits: Math.max(1000, Number(config.enterprise?.credits ?? 10000)),
139
+ offerActive: Boolean(config.enterprise?.offerActive),
140
+ offerPriceINR: config.enterprise?.offerPriceINR !== undefined ? Number(config.enterprise.offerPriceINR) : undefined,
141
+ offerPriceUSD: config.enterprise?.offerPriceUSD !== undefined ? Number(config.enterprise.offerPriceUSD) : undefined,
142
+ offerBadge: config.enterprise?.offerBadge || 'ENTERPRISE DEAL',
143
+ offerBannerText: config.enterprise?.offerBannerText || '',
144
+ },
145
+ };
146
+ fs.writeFileSync(PRICING_FILE, JSON.stringify(cleanConfig, null, 2), 'utf-8');
147
+ return cleanConfig;
148
+ }
149
+ export function updatePricingTier(tier, updates) {
150
+ const current = getPricingConfig();
151
+ if (!current[tier]) {
152
+ throw new Error(`Invalid plan tier: ${tier}`);
153
+ }
154
+ current[tier] = {
155
+ ...current[tier],
156
+ ...updates,
157
+ id: tier,
158
+ };
159
+ const saved = saveFullPricingConfig(current);
160
+ return saved[tier];
161
+ }
162
+ export function resetPricingToDefaults() {
163
+ return saveFullPricingConfig(DEFAULT_PRICING_CONFIG);
164
+ }
165
+ //# sourceMappingURL=pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["pricing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"razorpay.d.ts","sourceRoot":"","sources":["razorpay.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC,OAAO,EAA6C,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAIvF,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,mBAAmB,IAAI,QAAQ,CAc9C;AAED,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqC/F;AAED,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB,CAmFxF"}
@@ -0,0 +1,144 @@
1
+ import Razorpay from 'razorpay';
2
+ import crypto from 'crypto';
3
+ import dotenv from 'dotenv';
4
+ import { loadAuthConfig, saveAuthConfig, TIER_RANK } from './auth.js';
5
+ dotenv.config({ quiet: true });
6
+ export function getRazorpayKeyId() {
7
+ return process.env.RAZORPAY_KEY_ID || '';
8
+ }
9
+ export function getRazorpayKeySecret() {
10
+ return process.env.RAZORPAY_KEY_SECRET || '';
11
+ }
12
+ export function getRazorpayInstance() {
13
+ const key_id = getRazorpayKeyId();
14
+ const key_secret = getRazorpayKeySecret();
15
+ if (!key_id || !key_secret) {
16
+ const err = new Error('Razorpay credentials missing: RAZORPAY_KEY_ID and RAZORPAY_KEY_SECRET must be configured in environment variables.');
17
+ err.statusCode = 401;
18
+ throw err;
19
+ }
20
+ return new Razorpay({
21
+ key_id,
22
+ key_secret,
23
+ });
24
+ }
25
+ /**
26
+ * STEP 1: BACKEND - Create Razorpay Order
27
+ * Endpoint: POST /api/create-order
28
+ * Validates amount >= 100 paise and creates order via Razorpay API.
29
+ */
30
+ export async function createRazorpayOrder(params) {
31
+ const amount = Number(params.amount);
32
+ if (isNaN(amount) || amount < 100) {
33
+ const err = new Error('Validation Error: Minimum amount must be at least 100 paise.');
34
+ err.statusCode = 400;
35
+ throw err;
36
+ }
37
+ const currency = (params.currency || 'INR').toUpperCase();
38
+ const receipt = params.receipt || `rcpt_${Date.now()}_${Math.floor(Math.random() * 1000)}`;
39
+ const razorpay = getRazorpayInstance();
40
+ try {
41
+ const order = await razorpay.orders.create({
42
+ amount,
43
+ currency,
44
+ receipt,
45
+ notes: params.notes || {},
46
+ });
47
+ return {
48
+ order_id: order.id,
49
+ amount: Number(order.amount),
50
+ currency: order.currency,
51
+ receipt: order.receipt || receipt,
52
+ };
53
+ }
54
+ catch (err) {
55
+ if (err.statusCode === 401 || (err.error && err.error.code === 'BAD_REQUEST_ERROR' && err.error.description?.toLowerCase().includes('auth'))) {
56
+ const authErr = new Error(`Razorpay authentication failed: ${err.error?.description || err.message}`);
57
+ authErr.statusCode = 401;
58
+ throw authErr;
59
+ }
60
+ const apiErr = new Error(`Razorpay API Error: ${err.error?.description || err.message || 'Failed to create order'}`);
61
+ apiErr.statusCode = 500;
62
+ throw apiErr;
63
+ }
64
+ }
65
+ /**
66
+ * STEP 3: BACKEND - Verify Signature
67
+ * Endpoint: POST /api/verify-payment
68
+ * Algorithm: HMAC-SHA256(order_id + "|" + payment_id, KEY_SECRET)
69
+ * Returns success only if generated signature strictly matches.
70
+ */
71
+ export function verifyRazorpaySignature(params) {
72
+ const order_id = (params.order_id || '').trim();
73
+ const payment_id = (params.payment_id || '').trim();
74
+ const signature = (params.signature || '').trim();
75
+ // Validate missing fields: return 400
76
+ if (!order_id || !payment_id || !signature) {
77
+ const err = new Error('Missing required fields: order_id, payment_id, and signature are required.');
78
+ err.statusCode = 400;
79
+ throw err;
80
+ }
81
+ const secret = getRazorpayKeySecret();
82
+ if (!secret) {
83
+ const err = new Error('Razorpay Key Secret is not configured.');
84
+ err.statusCode = 500;
85
+ throw err;
86
+ }
87
+ // Generate HMAC-SHA256 signature
88
+ const body = `${order_id}|${payment_id}`;
89
+ const expectedSignature = crypto
90
+ .createHmac('sha256', secret)
91
+ .update(body)
92
+ .digest('hex');
93
+ let isValid = false;
94
+ try {
95
+ isValid = crypto.timingSafeEqual(Buffer.from(expectedSignature, 'utf-8'), Buffer.from(signature, 'utf-8'));
96
+ }
97
+ catch {
98
+ isValid = false;
99
+ }
100
+ if (!isValid) {
101
+ const err = new Error('Payment signature verification failed. Signature mismatch.');
102
+ err.statusCode = 400;
103
+ throw err;
104
+ }
105
+ // Provision tier upgrade and persist to auth configuration
106
+ const tier = params.tier || 'pro';
107
+ const existing = loadAuthConfig();
108
+ const currentTier = (existing.currentTier || 'free').toLowerCase();
109
+ const currentRank = TIER_RANK[currentTier] ?? 0;
110
+ const targetRank = TIER_RANK[tier] ?? 0;
111
+ if (currentRank > 0 && targetRank < currentRank) {
112
+ const err = new Error(`Downgrading from ${currentTier.toUpperCase()} to ${tier.toUpperCase()} is not allowed. Your active plan will automatically shift to the free tier upon its expiration date.`);
113
+ err.statusCode = 400;
114
+ throw err;
115
+ }
116
+ const totalCredits = tier === 'enterprise' ? 10000 : (tier === 'pro' ? 1000 : 100);
117
+ const renewAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString();
118
+ let updatedAuth;
119
+ try {
120
+ const updated = {
121
+ ...existing,
122
+ currentTier: tier,
123
+ creditsTotal: totalCredits,
124
+ creditsUsed: 0,
125
+ renewAt,
126
+ lastPaymentId: payment_id,
127
+ lastOrderId: order_id,
128
+ paymentProvider: 'razorpay',
129
+ };
130
+ saveAuthConfig(updated);
131
+ updatedAuth = updated;
132
+ }
133
+ catch { }
134
+ return {
135
+ success: true,
136
+ order_id,
137
+ payment_id,
138
+ tier,
139
+ totalCredits,
140
+ renewAt,
141
+ auth: updatedAuth,
142
+ };
143
+ }
144
+ //# sourceMappingURL=razorpay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"razorpay.js","sourceRoot":"","sources":["razorpay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["session.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACxC;AAiBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,MAAW,GAAG,kBAAkB,EAAE,CAW1E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,kBAAkB,CAgBhJ;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,GAAE,MAAU,GAAG,MAAM,CA4BxE"}