codebuff 1.0.219 → 1.0.221

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 (121) hide show
  1. package/dist/checkpoints/checkpoint-manager.d.ts +1 -1
  2. package/dist/checkpoints/checkpoint-manager.js +8 -6
  3. package/dist/checkpoints/checkpoint-manager.js.map +1 -1
  4. package/dist/cli-handlers/api-key.d.ts +25 -0
  5. package/dist/cli-handlers/api-key.js +66 -0
  6. package/dist/cli-handlers/api-key.js.map +1 -0
  7. package/dist/cli-handlers/checkpoint.d.ts +18 -0
  8. package/dist/cli-handlers/checkpoint.js +195 -0
  9. package/dist/cli-handlers/checkpoint.js.map +1 -0
  10. package/dist/cli-handlers/diff.d.ts +2 -0
  11. package/dist/cli-handlers/diff.js +31 -0
  12. package/dist/cli-handlers/diff.js.map +1 -0
  13. package/dist/cli-handlers/easter-egg.d.ts +1 -0
  14. package/dist/cli-handlers/easter-egg.js +126 -0
  15. package/dist/cli-handlers/easter-egg.js.map +1 -0
  16. package/dist/cli.d.ts +0 -18
  17. package/dist/cli.js +70 -397
  18. package/dist/cli.js.map +1 -1
  19. package/dist/client.d.ts +11 -11
  20. package/dist/client.js +123 -45
  21. package/dist/client.js.map +1 -1
  22. package/dist/code-map/tsconfig.tsbuildinfo +1 -1
  23. package/dist/common/actions.d.ts +288 -264
  24. package/dist/common/actions.js +10 -4
  25. package/dist/common/actions.js.map +1 -1
  26. package/dist/common/advanced-analyzer.d.ts +19 -0
  27. package/dist/common/advanced-analyzer.js +140 -0
  28. package/dist/common/advanced-analyzer.js.map +1 -0
  29. package/dist/common/billing/auto-topup.d.ts +8 -0
  30. package/dist/common/billing/auto-topup.js +192 -0
  31. package/dist/common/billing/auto-topup.js.map +1 -0
  32. package/dist/common/billing/balance-calculator.d.ts +55 -0
  33. package/dist/common/billing/balance-calculator.js +207 -0
  34. package/dist/common/billing/balance-calculator.js.map +1 -0
  35. package/dist/common/billing/check-auto-topup.d.ts +12 -0
  36. package/dist/common/billing/check-auto-topup.js +50 -0
  37. package/dist/common/billing/check-auto-topup.js.map +1 -0
  38. package/dist/common/billing/conversion.d.ts +9 -0
  39. package/dist/common/billing/conversion.js +20 -0
  40. package/dist/common/billing/conversion.js.map +1 -0
  41. package/dist/common/billing/credit-check.d.ts +8 -0
  42. package/dist/common/billing/credit-check.js +45 -0
  43. package/dist/common/billing/credit-check.js.map +1 -0
  44. package/dist/common/billing/credit-conversion.d.ts +24 -0
  45. package/dist/common/billing/credit-conversion.js +48 -0
  46. package/dist/common/billing/credit-conversion.js.map +1 -0
  47. package/dist/common/billing/grant-credits.d.ts +28 -0
  48. package/dist/common/billing/grant-credits.js +201 -0
  49. package/dist/common/billing/grant-credits.js.map +1 -0
  50. package/dist/common/billing/plans.d.ts +13 -0
  51. package/dist/common/billing/plans.js +44 -0
  52. package/dist/common/billing/plans.js.map +1 -0
  53. package/dist/common/billing/rollover-logic.d.ts +13 -0
  54. package/dist/common/billing/rollover-logic.js +174 -0
  55. package/dist/common/billing/rollover-logic.js.map +1 -0
  56. package/dist/common/billing/stripe-api.d.ts +31 -0
  57. package/dist/common/billing/stripe-api.js +104 -0
  58. package/dist/common/billing/stripe-api.js.map +1 -0
  59. package/dist/common/browser-actions.d.ts +62 -62
  60. package/dist/common/constants/grant-priorities.d.ts +2 -0
  61. package/dist/common/constants/grant-priorities.js +10 -0
  62. package/dist/common/constants/grant-priorities.js.map +1 -0
  63. package/dist/common/constants.d.ts +28 -1
  64. package/dist/common/constants.js +36 -7
  65. package/dist/common/constants.js.map +1 -1
  66. package/dist/common/db/schema.d.ts +323 -86
  67. package/dist/common/db/schema.js +55 -13
  68. package/dist/common/db/schema.js.map +1 -1
  69. package/dist/common/env.mjs +4 -1
  70. package/dist/common/env.mjs.map +1 -1
  71. package/dist/common/message-image-handling.d.ts +41 -0
  72. package/dist/common/message-image-handling.js +57 -0
  73. package/dist/common/message-image-handling.js.map +1 -0
  74. package/dist/common/types/agent-state.d.ts +8 -8
  75. package/dist/common/types/grant.d.ts +2 -0
  76. package/dist/common/types/grant.js +10 -0
  77. package/dist/common/types/grant.js.map +1 -0
  78. package/dist/common/types/usage.d.ts +37 -18
  79. package/dist/common/types/usage.js +9 -6
  80. package/dist/common/types/usage.js.map +1 -1
  81. package/dist/common/util/__tests__/saxy.test.d.ts +1 -0
  82. package/dist/common/util/__tests__/saxy.test.js +262 -0
  83. package/dist/common/util/__tests__/saxy.test.js.map +1 -0
  84. package/dist/common/util/credentials.d.ts +2 -2
  85. package/dist/common/util/dates.d.ts +10 -1
  86. package/dist/common/util/dates.js +11 -2
  87. package/dist/common/util/dates.js.map +1 -1
  88. package/dist/common/util/logger.js +32 -14
  89. package/dist/common/util/logger.js.map +1 -1
  90. package/dist/common/util/process-stream.d.ts +8 -0
  91. package/dist/common/util/process-stream.js +102 -0
  92. package/dist/common/util/process-stream.js.map +1 -0
  93. package/dist/common/util/promise.d.ts +1 -1
  94. package/dist/common/util/promise.js +2 -2
  95. package/dist/common/util/promise.js.map +1 -1
  96. package/dist/common/util/referral-credits.d.ts +1 -0
  97. package/dist/common/util/referral-credits.js +48 -0
  98. package/dist/common/util/referral-credits.js.map +1 -0
  99. package/dist/common/util/saxy.d.ts +8 -0
  100. package/dist/common/util/saxy.js +35 -12
  101. package/dist/common/util/saxy.js.map +1 -1
  102. package/dist/common/util/sync-failure.d.ts +1 -0
  103. package/dist/common/util/sync-failure.js +57 -0
  104. package/dist/common/util/sync-failure.js.map +1 -0
  105. package/dist/common/websockets/websocket-schema.d.ts +530 -480
  106. package/dist/index.js +1 -1
  107. package/dist/utils/__tests__/xml-stream-parser.test.js +6 -10
  108. package/dist/utils/__tests__/xml-stream-parser.test.js.map +1 -1
  109. package/package.json +1 -1
  110. package/dist/common/logger.d.ts +0 -1
  111. package/dist/common/logger.js +0 -7
  112. package/dist/common/logger.js.map +0 -1
  113. package/dist/common/util/constants.d.ts +0 -1
  114. package/dist/common/util/constants.js +0 -7
  115. package/dist/common/util/constants.js.map +0 -1
  116. package/dist/common/util/helpers.d.ts +0 -1
  117. package/dist/common/util/helpers.js +0 -6
  118. package/dist/common/util/helpers.js.map +0 -1
  119. package/dist/common/util/token-counter.d.ts +0 -3
  120. package/dist/common/util/token-counter.js +0 -27
  121. package/dist/common/util/token-counter.js.map +0 -1
@@ -5,6 +5,7 @@ const zod_1 = require("zod");
5
5
  const file_1 = require("./util/file");
6
6
  const constants_1 = require("./constants");
7
7
  const agent_state_1 = require("./types/agent-state");
8
+ const schema_1 = require("./db/schema");
8
9
  exports.FileChangeSchema = zod_1.z.object({
9
10
  type: zod_1.z.enum(['patch', 'file']),
10
11
  path: zod_1.z.string(),
@@ -49,10 +50,13 @@ exports.CLIENT_ACTION_SCHEMA = zod_1.z.discriminatedUnion('type', [
49
50
  exports.UsageReponseSchema = zod_1.z.object({
50
51
  type: zod_1.z.literal('usage-response'),
51
52
  usage: zod_1.z.number(),
52
- limit: zod_1.z.number(),
53
- subscription_active: zod_1.z.boolean(),
54
- next_quota_reset: zod_1.z.coerce.date(),
55
- session_credits_used: zod_1.z.number(),
53
+ remainingBalance: zod_1.z.number(),
54
+ balanceBreakdown: zod_1.z
55
+ .record(zod_1.z.enum(schema_1.grantTypeEnum.enumValues), zod_1.z.number())
56
+ .optional(),
57
+ next_quota_reset: zod_1.z.coerce.date().nullable(),
58
+ nextMonthlyGrant: zod_1.z.number(),
59
+ autoTopupAdded: zod_1.z.number().optional(),
56
60
  });
57
61
  exports.InitResponseSchema = zod_1.z
58
62
  .object({
@@ -125,6 +129,8 @@ exports.SERVER_ACTION_SCHEMA = zod_1.z.discriminatedUnion('type', [
125
129
  zod_1.z.object({
126
130
  type: zod_1.z.literal('action-error'),
127
131
  message: zod_1.z.string(),
132
+ error: zod_1.z.string().optional(),
133
+ remainingBalance: zod_1.z.number().optional(),
128
134
  }),
129
135
  zod_1.z.object({
130
136
  type: zod_1.z.literal('commit-message-response'),
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AACvB,sCAAyE;AACzE,2CAAuC;AACvC,qDAI4B;AAGf,QAAA,gBAAgB,GAAG,OAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAA;AAEW,QAAA,OAAO,GAAG,OAAC,CAAC,KAAK,CAAC,wBAAgB,CAAC,CAAA;AAGnC,QAAA,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC;CACrC,CAAC,CAAA;AAGW,QAAA,oBAAoB,GAAG,OAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACzB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,OAAC,CAAC,SAAS,EAAE,CAAC;QACpC,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;QACzB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,QAAQ,EAAE,OAAC,CAAC,IAAI,CAAC,qBAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxD,UAAU,EAAE,8BAAgB;QAC5B,WAAW,EAAE,OAAC,CAAC,KAAK,CAAC,8BAAgB,CAAC;QACtC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC7B,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC;QACtC,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACjC,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;QACzB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,WAAW,EAAE,+BAAwB;KACtC,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC;QAC1C,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;QACzB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;KAC1B,CAAC;CACH,CAAC,CAAA;AAGW,QAAA,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACjC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,mBAAmB,EAAE,OAAC,CAAC,OAAO,EAAE;IAChC,gBAAgB,EAAE,OAAC,CAAC,MAAM,CAAC,IAAI,EAAE;IACjC,oBAAoB,EAAE,OAAC,CAAC,MAAM,EAAE;CACjC,CAAC,CAAA;AAGW,QAAA,kBAAkB,GAAG,OAAC;KAChC,MAAM,CAAC;IACN,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,eAAe,CAAC;CACjC,CAAC;KACD,KAAK,CACJ,0BAAkB,CAAC,IAAI,CAAC;IACtB,IAAI,EAAE,IAAI;CACX,CAAC,CACH,CAAA;AAGU,QAAA,sBAAsB,GAAG,OAAC;KACpC,MAAM,CAAC;IACN,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACpC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,eAAO;IAChB,qBAAqB,EAAE,eAAO;IAC9B,iBAAiB,EAAE,OAAC,CAAC,KAAK,CAAC,wBAAiB,CAAC;IAC7C,iBAAiB,EAAE,OAAC,CAAC,OAAO,EAAE;CAC/B,CAAC;KACD,KAAK,CACJ,0BAAkB,CAAC,IAAI,CAAC;IACtB,IAAI,EAAE,IAAI;CACX,CAAC,CAAC,OAAO,EAAE,CACb,CAAA;AAEU,QAAA,yBAAyB,GAAG,OAAC,CAAC,MAAM,CAAC;IAChD,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACxC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAA;AAGW,QAAA,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;IAClC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,8BAAgB;IAC5B,SAAS,EAAE,OAAC,CAAC,KAAK,CAAC,4BAAiB,CAAC;IACrC,WAAW,EAAE,OAAC,CAAC,KAAK,CAAC,8BAAgB,CAAC;CACvC,CAAC,CAAA;AAGW,QAAA,oBAAoB,GAAG,OAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;QACjC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;KAClB,CAAC;IACF,8BAAsB;IACtB,4BAAoB;IACpB,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,YAAY,CAAC;QAC7B,SAAS,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;KACtB,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QAC5B,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;QACpB,IAAI,EAAE,sBAAc;QACpB,OAAO,EAAE,eAAO;QAChB,qBAAqB,EAAE,eAAO;QAC9B,iBAAiB,EAAE,OAAC,CAAC,KAAK,CAAC,wBAAiB,CAAC;QAC7C,iBAAiB,EAAE,OAAC,CAAC,OAAO,EAAE;KAC/B,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC;QAC1C,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;KACnB,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACrC,UAAU,EAAE,OAAC,CAAC,OAAO,EAAE;QACvB,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;KAC1B,CAAC;IACF,0BAAkB;IAClB,0BAAkB;IAClB,iCAAyB;IACzB,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;KACpB,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC;QAC1C,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;KAC1B,CAAC;CACH,CAAC,CAAA"}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { BrowserResponse } from './browser-actions';
2
+ /**
3
+ * Each detected issue includes a type, severity, detection reason,
4
+ * and an optional recommendation for the user.
5
+ */
6
+ export interface AnalysisIssue {
7
+ type: string;
8
+ severity: 'low' | 'medium' | 'high';
9
+ message: string;
10
+ recommendation?: string;
11
+ }
12
+ export interface AnalysisResult {
13
+ issues: AnalysisIssue[];
14
+ }
15
+ /**
16
+ * Entrypoint function to run a suite of heuristic checks over
17
+ * logs, network events, performance metrics, etc.
18
+ */
19
+ export declare function analyzeBrowserData(response: BrowserResponse): AnalysisResult;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeBrowserData = analyzeBrowserData;
4
+ /**
5
+ * Entrypoint function to run a suite of heuristic checks over
6
+ * logs, network events, performance metrics, etc.
7
+ */
8
+ function analyzeBrowserData(response) {
9
+ const issues = [];
10
+ // 1. Check logs for known error patterns or repeated errors
11
+ issues.push(...analyzeLogs(response));
12
+ // 2. Check network events for 4xx, 5xx, or suspicious patterns
13
+ issues.push(...analyzeNetwork(response));
14
+ // 3. Check performance metrics (TTFB, LCP, memory usage, etc.)
15
+ if (response.metrics) {
16
+ issues.push(...analyzePerformance(response.metrics));
17
+ }
18
+ // Return combined issues
19
+ return { issues };
20
+ }
21
+ function analyzeLogs(response) {
22
+ const issues = [];
23
+ const logs = response.logs || [];
24
+ // Check for high number of JavaScript errors
25
+ const jsErrors = logs.filter((log) => log.type === 'error');
26
+ if (jsErrors.length > 5) {
27
+ issues.push({
28
+ type: 'JS_ERROR_OVERFLOW',
29
+ severity: 'medium',
30
+ message: `Detected ${jsErrors.length} JavaScript errors in logs.`,
31
+ recommendation: 'Review the console logs for repeated error patterns. Fix the root cause or handle errors in code.'
32
+ });
33
+ }
34
+ // Pattern-based error detection
35
+ const errorPatterns = {
36
+ 'not defined': {
37
+ severity: 'medium',
38
+ recommendation: 'Check for missing script dependencies or undefined variables'
39
+ },
40
+ 'Failed to fetch': {
41
+ severity: 'medium',
42
+ recommendation: 'Verify endpoint URLs and network connectivity'
43
+ },
44
+ 'SSL': {
45
+ severity: 'high',
46
+ recommendation: 'SSL certificate error - check HTTPS configuration'
47
+ },
48
+ 'ERR_NAME_NOT_RESOLVED': {
49
+ severity: 'medium',
50
+ recommendation: 'DNS resolution failed - check domain name'
51
+ },
52
+ 'ERR_CONNECTION_TIMED_OUT': {
53
+ severity: 'medium',
54
+ recommendation: 'Connection timeout - check network or firewall'
55
+ },
56
+ 'Navigation timeout': {
57
+ severity: 'medium',
58
+ recommendation: 'Page took too long to load - check performance or timeouts'
59
+ },
60
+ 'Frame detached': {
61
+ severity: 'low',
62
+ recommendation: 'Target frame or element no longer exists'
63
+ },
64
+ 'Node is detached': {
65
+ severity: 'low',
66
+ recommendation: 'Element was removed from DOM'
67
+ }
68
+ };
69
+ for (const log of jsErrors) {
70
+ for (const [pattern, { severity, recommendation }] of Object.entries(errorPatterns)) {
71
+ if (log.message.includes(pattern)) {
72
+ issues.push({
73
+ type: 'JS_ERROR',
74
+ severity,
75
+ message: `Error detected: ${log.message}`,
76
+ recommendation
77
+ });
78
+ break; // Stop after first matching pattern
79
+ }
80
+ }
81
+ }
82
+ return issues;
83
+ }
84
+ function analyzeNetwork(response) {
85
+ const issues = [];
86
+ const netEvents = response.networkEvents || [];
87
+ // Count 4xx / 5xx
88
+ const errorEvents = netEvents.filter((evt) => (evt.status && evt.status >= 400) || evt.errorText);
89
+ if (errorEvents.length > 0) {
90
+ issues.push({
91
+ type: 'NETWORK_ERRORS',
92
+ severity: 'medium',
93
+ message: `${errorEvents.length} network request(s) failed with 4xx/5xx error(s).`,
94
+ recommendation: 'Check your API endpoints and resource URLs. Verify server logs for possible configuration or routing issues.'
95
+ });
96
+ }
97
+ // Detect repeated 404s
98
+ const fourOhFours = netEvents.filter((e) => e.status === 404);
99
+ if (fourOhFours.length > 2) {
100
+ issues.push({
101
+ type: 'MISSING_RESOURCES',
102
+ severity: 'low',
103
+ message: `${fourOhFours.length} resources returned 404 Not Found.`,
104
+ recommendation: 'Ensure static assets or pages exist at the requested path.'
105
+ });
106
+ }
107
+ return issues;
108
+ }
109
+ function analyzePerformance(metrics) {
110
+ const issues = [];
111
+ // Check Time to First Byte
112
+ if ((metrics.ttfb ?? 0) > 1000) {
113
+ issues.push({
114
+ type: 'HIGH_TTFB',
115
+ severity: 'medium',
116
+ message: `Time to First Byte is ${metrics.ttfb}ms, which is high.`,
117
+ recommendation: 'Optimize server response times or check network constraints. Look for server-side bottlenecks.'
118
+ });
119
+ }
120
+ // Check memory usage
121
+ if (metrics.memoryUsage > 100_000_000) { // ~100MB in JS heap
122
+ issues.push({
123
+ type: 'HIGH_MEMORY_USAGE',
124
+ severity: 'medium',
125
+ message: `Memory usage reached ${metrics.memoryUsage} bytes in JS heap.`,
126
+ recommendation: 'Investigate potential memory leaks, unbounded data structures, or large on-page assets.'
127
+ });
128
+ }
129
+ // Check Largest Contentful Paint
130
+ if ((metrics.lcp ?? 0) > 4000) {
131
+ issues.push({
132
+ type: 'PERFORMANCE_LCP',
133
+ severity: 'medium',
134
+ message: `Largest Contentful Paint is ${metrics.lcp}ms (over 4s).`,
135
+ recommendation: 'Consider optimizing images, breaking up large bundle files, or deferring non-critical scripts.'
136
+ });
137
+ }
138
+ return issues;
139
+ }
140
+ //# sourceMappingURL=advanced-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advanced-analyzer.js","sourceRoot":"","sources":["../src/advanced-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type Stripe from 'stripe';
2
+ interface AutoTopupValidationResult {
3
+ blockedReason: string | null;
4
+ validPaymentMethod: Stripe.PaymentMethod | null;
5
+ }
6
+ export declare function validateAutoTopupStatus(userId: string): Promise<AutoTopupValidationResult>;
7
+ export declare function checkAndTriggerAutoTopup(userId: string): Promise<void>;
8
+ export {};
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.validateAutoTopupStatus = validateAutoTopupStatus;
30
+ exports.checkAndTriggerAutoTopup = checkAndTriggerAutoTopup;
31
+ const db_1 = __importDefault(require("../db"));
32
+ const schema = __importStar(require("../db/schema"));
33
+ const drizzle_orm_1 = require("drizzle-orm");
34
+ const stripe_1 = require("../util/stripe");
35
+ const logger_1 = require("../util/logger");
36
+ const grant_credits_1 = require("./grant-credits");
37
+ const balance_calculator_1 = require("./balance-calculator");
38
+ const conversion_1 = require("./conversion");
39
+ const string_1 = require("../util/string");
40
+ const env_mjs_1 = require("src/env.mjs");
41
+ const MINIMUM_PURCHASE_CREDITS = 500;
42
+ class AutoTopupValidationError extends Error {
43
+ constructor(message) {
44
+ super(message);
45
+ this.name = 'AutoTopupValidationError';
46
+ }
47
+ }
48
+ class AutoTopupPaymentError extends Error {
49
+ constructor(message) {
50
+ super(message);
51
+ this.name = 'AutoTopupPaymentError';
52
+ }
53
+ }
54
+ async function validateAutoTopupStatus(userId) {
55
+ const logContext = { userId };
56
+ try {
57
+ const user = await db_1.default.query.user.findFirst({
58
+ where: (0, drizzle_orm_1.eq)(schema.user.id, userId),
59
+ columns: {
60
+ stripe_customer_id: true,
61
+ },
62
+ });
63
+ if (!user?.stripe_customer_id) {
64
+ throw new AutoTopupValidationError(`You don't have a valid account with us. Please log in at ${env_mjs_1.env.NEXT_PUBLIC_APP_URL}/login`);
65
+ }
66
+ const paymentMethods = await stripe_1.stripeServer.paymentMethods.list({
67
+ customer: user.stripe_customer_id,
68
+ type: 'card',
69
+ });
70
+ const validPaymentMethod = paymentMethods.data.find((pm) => pm.card?.exp_year &&
71
+ pm.card.exp_month &&
72
+ new Date(pm.card.exp_year, pm.card.exp_month - 1) > new Date());
73
+ if (!validPaymentMethod) {
74
+ throw new AutoTopupValidationError('You need a valid payment method to enable auto top-up. Try buying some credits!');
75
+ }
76
+ return {
77
+ blockedReason: null,
78
+ validPaymentMethod,
79
+ };
80
+ }
81
+ catch (error) {
82
+ const blockedReason = error instanceof AutoTopupValidationError
83
+ ? error.message
84
+ : 'Unable to verify payment method status.';
85
+ await disableAutoTopup(userId, blockedReason);
86
+ return {
87
+ blockedReason,
88
+ validPaymentMethod: null,
89
+ };
90
+ }
91
+ }
92
+ async function disableAutoTopup(userId, reason) {
93
+ await db_1.default
94
+ .update(schema.user)
95
+ .set({ auto_topup_enabled: false })
96
+ .where((0, drizzle_orm_1.eq)(schema.user.id, userId));
97
+ logger_1.logger.info({ userId, reason }, 'Disabled auto top-up');
98
+ }
99
+ async function processAutoTopupPayment(userId, amountToTopUp, stripeCustomerId, paymentMethod) {
100
+ const logContext = { userId, amountToTopUp };
101
+ const operationId = `auto-${userId}-${(0, string_1.generateCompactId)()}`;
102
+ const centsPerCredit = await (0, conversion_1.getUserCostPerCredit)(userId);
103
+ const amountInCents = (0, conversion_1.convertCreditsToUsdCents)(amountToTopUp, centsPerCredit);
104
+ if (amountInCents <= 0) {
105
+ throw new AutoTopupPaymentError('Invalid payment amount calculated');
106
+ }
107
+ const paymentIntent = await stripe_1.stripeServer.paymentIntents.create({
108
+ amount: amountInCents,
109
+ currency: 'usd',
110
+ customer: stripeCustomerId,
111
+ payment_method: paymentMethod.id,
112
+ off_session: true,
113
+ confirm: true,
114
+ description: `Auto top-up: ${amountToTopUp.toLocaleString()} credits`,
115
+ metadata: {
116
+ userId,
117
+ credits: amountToTopUp.toString(),
118
+ operationId,
119
+ grantType: 'purchase',
120
+ type: 'auto-topup',
121
+ },
122
+ });
123
+ if (paymentIntent.status !== 'succeeded') {
124
+ throw new AutoTopupPaymentError('Payment failed or requires action');
125
+ }
126
+ await (0, grant_credits_1.processAndGrantCredit)(userId, amountToTopUp, 'purchase', `Auto top-up of ${amountToTopUp.toLocaleString()} credits`, null, operationId);
127
+ logger_1.logger.info({
128
+ ...logContext,
129
+ operationId,
130
+ paymentIntentId: paymentIntent.id,
131
+ }, 'Auto top-up payment succeeded and credits granted');
132
+ }
133
+ async function checkAndTriggerAutoTopup(userId) {
134
+ const logContext = { userId };
135
+ try {
136
+ const user = await db_1.default.query.user.findFirst({
137
+ where: (0, drizzle_orm_1.eq)(schema.user.id, userId),
138
+ columns: {
139
+ id: true,
140
+ stripe_customer_id: true,
141
+ auto_topup_enabled: true,
142
+ auto_topup_threshold: true,
143
+ auto_topup_amount: true,
144
+ next_quota_reset: true,
145
+ },
146
+ });
147
+ if (!user ||
148
+ !user.auto_topup_enabled ||
149
+ user.auto_topup_threshold === null ||
150
+ user.auto_topup_amount === null ||
151
+ !user.stripe_customer_id) {
152
+ return;
153
+ }
154
+ const { blockedReason, validPaymentMethod } = await validateAutoTopupStatus(userId);
155
+ if (blockedReason || !validPaymentMethod) {
156
+ throw new Error(blockedReason || 'Auto top-up is not available.');
157
+ }
158
+ const { balance } = await (0, balance_calculator_1.calculateUsageAndBalance)(userId, user.next_quota_reset ?? new Date(0));
159
+ if (balance.totalRemaining >= user.auto_topup_threshold && balance.totalDebt === 0) {
160
+ return;
161
+ }
162
+ const amountToTopUp = balance.totalDebt > 0
163
+ ? Math.max(user.auto_topup_amount, balance.totalDebt)
164
+ : user.auto_topup_amount;
165
+ if (amountToTopUp < MINIMUM_PURCHASE_CREDITS) {
166
+ logger_1.logger.warn(logContext, `Auto-top-up triggered but amount ${amountToTopUp} is less than minimum ${MINIMUM_PURCHASE_CREDITS}. Skipping top-up. Check user settings.`);
167
+ return;
168
+ }
169
+ logger_1.logger.info({
170
+ ...logContext,
171
+ currentBalance: balance.totalRemaining,
172
+ currentDebt: balance.totalDebt,
173
+ threshold: user.auto_topup_threshold,
174
+ amountToTopUp,
175
+ }, `Auto-top-up triggered for user ${userId}. Attempting to purchase ${amountToTopUp} credits.`);
176
+ try {
177
+ await processAutoTopupPayment(userId, amountToTopUp, user.stripe_customer_id, validPaymentMethod);
178
+ }
179
+ catch (error) {
180
+ const message = error instanceof AutoTopupPaymentError
181
+ ? error.message
182
+ : 'Payment failed. Please check your payment method and re-enable auto top-up.';
183
+ await disableAutoTopup(userId, message);
184
+ throw new Error(message);
185
+ }
186
+ }
187
+ catch (error) {
188
+ logger_1.logger.error({ ...logContext, error }, `Error during auto-top-up check for user ${userId}`);
189
+ throw error;
190
+ }
191
+ }
192
+ //# sourceMappingURL=auto-topup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-topup.js","sourceRoot":"","sources":["../../src/billing/auto-topup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import db from '../db';
2
+ import { GrantType } from '../db/schema';
3
+ export interface CreditBalance {
4
+ totalRemaining: number;
5
+ totalDebt: number;
6
+ netBalance: number;
7
+ breakdown: Partial<Record<GrantType, number>>;
8
+ principals: Partial<Record<GrantType, number>>;
9
+ }
10
+ export interface CreditUsageAndBalance {
11
+ usageThisCycle: number;
12
+ balance: CreditBalance;
13
+ }
14
+ export interface CreditConsumptionResult {
15
+ consumed: number;
16
+ fromPurchased: number;
17
+ }
18
+ type DbConn = Pick<typeof db, 'select' | 'update'>;
19
+ /**
20
+ * Gets active grants for a user, ordered by expiration (soonest first), then priority, and creation date.
21
+ * Added optional `conn` param so callers inside a transaction can supply their TX object.
22
+ */
23
+ export declare function getOrderedActiveGrants(userId: string, now: Date, conn?: DbConn): Promise<{
24
+ created_at: Date;
25
+ type: import("../types/grant").GrantType;
26
+ expires_at: Date | null;
27
+ operation_id: string;
28
+ user_id: string;
29
+ principal: number;
30
+ balance: number;
31
+ description: string | null;
32
+ priority: number;
33
+ }[]>;
34
+ /**
35
+ * Calculates both the current balance and usage in this cycle in a single query.
36
+ * This is more efficient than calculating them separately.
37
+ */
38
+ export declare function calculateUsageAndBalance(userId: string, quotaResetDate: Date, now?: Date): Promise<CreditUsageAndBalance>;
39
+ /**
40
+ * Updates the remaining amounts in credit grants after consumption.
41
+ * Follows priority order strictly - higher priority grants (lower number) are consumed first.
42
+ * Returns details about credit consumption including how many came from purchased credits.
43
+ *
44
+ * @param userId The ID of the user
45
+ * @param creditsToConsume Number of credits being consumed
46
+ * @returns Promise resolving to number of credits consumed
47
+ * @throws Error if user has any debt
48
+ */
49
+ export declare function consumeCredits(userId: string, creditsToConsume: number): Promise<CreditConsumptionResult>;
50
+ /**
51
+ * Calculate the total credits used during the current billing cycle for a user
52
+ * by summing the difference between initial and remaining amounts for all relevant grants.
53
+ */
54
+ export declare function calculateUsageThisCycle(userId: string, quotaResetDate: Date): Promise<number>;
55
+ export {};