vidspotai-shared 1.0.87 → 1.0.88

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 (75) hide show
  1. package/lib/globals/creditUnit.d.ts +17 -0
  2. package/lib/globals/creditUnit.d.ts.map +1 -1
  3. package/lib/globals/creditUnit.js +18 -1
  4. package/lib/globals/index.d.ts +1 -0
  5. package/lib/globals/index.d.ts.map +1 -1
  6. package/lib/globals/index.js +1 -0
  7. package/lib/globals/types.d.ts +11 -2
  8. package/lib/globals/types.d.ts.map +1 -1
  9. package/lib/globals/types.js +9 -0
  10. package/lib/models/agent.model.d.ts +18 -0
  11. package/lib/models/agent.model.d.ts.map +1 -1
  12. package/lib/models/video.model.d.ts +11 -0
  13. package/lib/models/video.model.d.ts.map +1 -1
  14. package/lib/schemas/agentRunJob.schema.d.ts +1 -0
  15. package/lib/schemas/agentRunJob.schema.d.ts.map +1 -1
  16. package/lib/schemas/agentRunJob.schema.js +9 -0
  17. package/lib/services/agent/beatSnap.d.ts +3 -0
  18. package/lib/services/agent/beatSnap.d.ts.map +1 -1
  19. package/lib/services/agent/beatSnap.js +5 -0
  20. package/lib/services/agent/executor/core.d.ts +6 -0
  21. package/lib/services/agent/executor/core.d.ts.map +1 -1
  22. package/lib/services/agent/executor/core.js +45 -0
  23. package/lib/services/agent/executor/types.d.ts +29 -0
  24. package/lib/services/agent/executor/types.d.ts.map +1 -1
  25. package/lib/services/agent/executor/visual.d.ts.map +1 -1
  26. package/lib/services/agent/executor/visual.js +7 -0
  27. package/lib/services/agent/index.d.ts +1 -0
  28. package/lib/services/agent/index.d.ts.map +1 -1
  29. package/lib/services/agent/index.js +1 -0
  30. package/lib/services/agent/resnapVo.d.ts +51 -0
  31. package/lib/services/agent/resnapVo.d.ts.map +1 -0
  32. package/lib/services/agent/resnapVo.js +102 -0
  33. package/lib/services/aiGen/providers/alibaba/alibaba.d.ts +1 -1
  34. package/lib/services/aiGen/providers/alibaba/alibaba.d.ts.map +1 -1
  35. package/lib/services/aiGen/providers/alibaba/alibaba.js +2 -2
  36. package/lib/services/aiGen/providers/bytedance/bytedance.service.d.ts.map +1 -1
  37. package/lib/services/aiGen/providers/bytedance/bytedance.service.js +8 -0
  38. package/lib/services/aiGen/providers/google/google.service.d.ts +1 -1
  39. package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
  40. package/lib/services/aiGen/providers/google/google.service.js +71 -16
  41. package/lib/services/aiGen/providers/google/googleErrors.d.ts +28 -0
  42. package/lib/services/aiGen/providers/google/googleErrors.d.ts.map +1 -1
  43. package/lib/services/aiGen/providers/google/googleErrors.js +75 -2
  44. package/lib/services/aiGen/providers/google/googleKeyPool.d.ts +8 -1
  45. package/lib/services/aiGen/providers/google/googleKeyPool.d.ts.map +1 -1
  46. package/lib/services/aiGen/providers/google/googleKeyPool.js +77 -9
  47. package/lib/services/aiGen/providers/kling/klingImage.service.d.ts +1 -1
  48. package/lib/services/aiGen/providers/kling/klingImage.service.d.ts.map +1 -1
  49. package/lib/services/aiGen/providers/kling/klingImage.service.js +3 -3
  50. package/lib/services/aiGen/providers/minimax/minimax.service.d.ts +1 -1
  51. package/lib/services/aiGen/providers/minimax/minimax.service.d.ts.map +1 -1
  52. package/lib/services/aiGen/providers/minimax/minimax.service.js +16 -7
  53. package/lib/services/aiGen/providers/openai/openai.service.d.ts +1 -1
  54. package/lib/services/aiGen/providers/openai/openai.service.d.ts.map +1 -1
  55. package/lib/services/aiGen/providers/openai/openai.service.js +13 -3
  56. package/lib/services/aiGen/providers/runway/runway.service.d.ts +1 -1
  57. package/lib/services/aiGen/providers/runway/runway.service.d.ts.map +1 -1
  58. package/lib/services/aiGen/providers/runway/runway.service.js +3 -3
  59. package/lib/services/aiGen/providers/types.d.ts +8 -0
  60. package/lib/services/aiGen/providers/types.d.ts.map +1 -1
  61. package/lib/services/bullmq.service.d.ts.map +1 -1
  62. package/lib/services/bullmq.service.js +13 -5
  63. package/lib/services/freePlan/index.d.ts +38 -0
  64. package/lib/services/freePlan/index.d.ts.map +1 -0
  65. package/lib/services/freePlan/index.js +55 -0
  66. package/lib/services/index.d.ts +1 -0
  67. package/lib/services/index.d.ts.map +1 -1
  68. package/lib/services/index.js +1 -0
  69. package/lib/utils/errors.d.ts +23 -0
  70. package/lib/utils/errors.d.ts.map +1 -1
  71. package/lib/utils/errors.js +75 -1
  72. package/lib/utils/helpers.d.ts +8 -1
  73. package/lib/utils/helpers.d.ts.map +1 -1
  74. package/lib/utils/helpers.js +9 -2
  75. package/package.json +1 -1
@@ -16,6 +16,6 @@ export declare class KlingImageService extends BaseAiGenProviderService {
16
16
  private pollUntilDone;
17
17
  private uploadToStorage;
18
18
  generateImage(params: ImageGenerationParams): Promise<ImageGenerationResult>;
19
- getCreditUsed({ modelKey, numImages, multiClip }: CreditUsageParams): number;
19
+ getCreditUsed({ modelKey, numImages, multiClip, creditFloor }: CreditUsageParams): number;
20
20
  }
21
21
  //# sourceMappingURL=klingImage.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"klingImage.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/kling/klingImage.service.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA2C3F,qBAAa,iBAAkB,SAAQ,wBAAwB;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAE/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IAExC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IAErC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAGxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkD;IAC9E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmD;;IAWhF,OAAO,CAAC,cAAc;YAUR,OAAO;YA6BP,mBAAmB;YAsCnB,uBAAuB;YAmCvB,aAAa;YA+Bb,eAAe;IAmBvB,aAAa,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAuClF,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAa,EAAE,SAAiB,EAAE,EAAE,iBAAiB,GAAG,MAAM;CASzF"}
1
+ {"version":3,"file":"klingImage.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/kling/klingImage.service.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA2C3F,qBAAa,iBAAkB,SAAQ,wBAAwB;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAE/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IAExC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IAErC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAGxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkD;IAC9E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmD;;IAWhF,OAAO,CAAC,cAAc;YAUR,OAAO;YA6BP,mBAAmB;YAsCnB,uBAAuB;YAmCvB,aAAa;YA+Bb,eAAe;IAmBvB,aAAa,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAuClF,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAa,EAAE,SAAiB,EAAE,WAAW,EAAE,EAAE,iBAAiB,GAAG,MAAM;CAStG"}
@@ -195,14 +195,14 @@ class KlingImageService extends baseAiGenProvider_service_1.BaseAiGenProviderSer
195
195
  imageUrls: signedUrls.length > 1 ? signedUrls : undefined,
196
196
  };
197
197
  }
198
- getCreditUsed({ modelKey, numImages = 1, multiClip = false }) {
198
+ getCreditUsed({ modelKey, numImages = 1, multiClip = false, creditFloor }) {
199
199
  const modelConfig = aiModels_1.aiModelConfigs[modelKey];
200
200
  const cost = modelConfig?.cost?.fixed;
201
201
  if (cost === undefined) {
202
202
  logger_1.logger.warn(`KlingImageService.getCreditUsed: no fixed cost for "${modelKey}" — using fallback`);
203
- return (0, helpers_1.getCreditsFromCost)(0.05 * Math.max(1, numImages), !multiClip);
203
+ return (0, helpers_1.getCreditsFromCost)(0.05 * Math.max(1, numImages), !multiClip, creditFloor);
204
204
  }
205
- return (0, helpers_1.getCreditsFromCost)(cost * Math.max(1, numImages), !multiClip);
205
+ return (0, helpers_1.getCreditsFromCost)(cost * Math.max(1, numImages), !multiClip, creditFloor);
206
206
  }
207
207
  }
208
208
  exports.KlingImageService = KlingImageService;
@@ -25,6 +25,6 @@ export declare class MinimaxService extends BaseAiGenProviderService {
25
25
  * { model, prompt, lyrics?, refer_voice?, audio_setting: { sample_rate, bitrate, format } }
26
26
  */
27
27
  generateMusic(params: MusicGenerationParams): Promise<MusicGenerationResult>;
28
- getCreditUsed({ modelKey, resolution, duration, multiClip, numImages, }: CreditUsageParams): number;
28
+ getCreditUsed({ modelKey, resolution, duration, multiClip, numImages, creditFloor, }: CreditUsageParams): number;
29
29
  }
30
30
  //# sourceMappingURL=minimax.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"minimax.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/minimax/minimax.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAUlB;;;GAGG;AAGH,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AAsGpE,qBAAa,cAAe,SAAQ,wBAAwB;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;YAUlB,OAAO;IAuDf,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAgE3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6EjD;;;;OAIG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAuDjC;;;;;OAKG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA+CjC,aAAa,CAAC,EACZ,QAAQ,EACR,UAAmB,EACnB,QAAY,EACZ,SAAiB,EACjB,SAAa,GACd,EAAE,iBAAiB,GAAG,MAAM;CA+B9B"}
1
+ {"version":3,"file":"minimax.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/minimax/minimax.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAUlB;;;GAGG;AAGH,eAAO,MAAM,+BAA+B,uBAAuB,CAAC;AA+GpE,qBAAa,cAAe,SAAQ,wBAAwB;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IAEpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;YAUlB,OAAO;IAuDf,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAgE3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6EjD;;;;OAIG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAuDjC;;;;;OAKG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA+CjC,aAAa,CAAC,EACZ,QAAQ,EACR,UAAmB,EACnB,QAAY,EACZ,SAAiB,EACjB,SAAa,EACb,WAAW,GACZ,EAAE,iBAAiB,GAAG,MAAM;CAgC9B"}
@@ -56,12 +56,21 @@ function classifyMinimaxError(code, msg) {
56
56
  case 1027:
57
57
  return { message: "Your request was declined because the generated content was flagged for sensitive material. Please adjust your prompt and try again.", code: errors_1.USER_FACING_ERROR_CODES.CONTENT_POLICY_VIOLATION, isUserInput: true };
58
58
  case 1002:
59
- // Minimax-side rate limit. Not strictly "user input" but treated as
60
- // user-facing so the frontend shows a translated retry message AND so
61
- // sceneGeneration logs it as warn (no Slack page for upstream throttle).
62
- return { message: "The request was rejected due to a rate limit or quota issue. Please try again in a moment.", code: errors_1.USER_FACING_ERROR_CODES.VIDEO_PROVIDER_RATE_LIMITED, isUserInput: true };
59
+ // MiniMax code 1002 = "trigger rate limit" (transient throttle, per the
60
+ // base_resp spec) NOT balance depletion (that's 1008 below). Treated as
61
+ // user-facing so the frontend shows a translated retry message AND so the
62
+ // pipeline logs it as warn (no Slack page for an upstream throttle).
63
+ return { message: "The request was rejected due to a rate limit. Please try again in a moment.", code: errors_1.USER_FACING_ERROR_CODES.VIDEO_PROVIDER_RATE_LIMITED, isUserInput: true };
64
+ case 1008:
65
+ // 1008 = "insufficient balance" — OUR MiniMax account is out of credit.
66
+ // This is an ops-actionable billing outage (top up the account), not a
67
+ // user error, so it MUST page: ACCOUNT_QUOTA_EXCEEDED is not in the
68
+ // non-paging set. isUserInput:false so it isn't prefixed/suppressed.
69
+ return { message: "The video service is temporarily unavailable due to an account limit. Please try again later.", code: errors_1.USER_FACING_ERROR_CODES.ACCOUNT_QUOTA_EXCEEDED, isUserInput: false };
63
70
  case 1004:
64
- return { message: "Authorization failed for the video generation service. Please contact support.", isUserInput: false };
71
+ // 1004 = authentication failed a bad/revoked MiniMax key (deploy/config
72
+ // fault). Must page: PROVIDER_AUTH_ERROR is not in the non-paging set.
73
+ return { message: "Authorization failed for the video generation service. Please contact support.", code: errors_1.USER_FACING_ERROR_CODES.PROVIDER_AUTH_ERROR, isUserInput: false };
65
74
  default:
66
75
  return { message: msg || `Generation failed (code ${code})`, isUserInput: false };
67
76
  }
@@ -365,7 +374,7 @@ class MinimaxService extends baseAiGenProvider_service_1.BaseAiGenProviderServic
365
374
  providerRequestId: resp.trace_id,
366
375
  };
367
376
  }
368
- getCreditUsed({ modelKey, resolution = "512P", duration = 6, multiClip = false, numImages = 1, }) {
377
+ getCreditUsed({ modelKey, resolution = "512P", duration = 6, multiClip = false, numImages = 1, creditFloor, }) {
369
378
  const modelConfig = aiModels_1.aiModelConfigs[modelKey];
370
379
  // Music-gen / image-gen — flat fixed price (music-1.5 ~$0.05, image-01 ~$0.01 × n).
371
380
  if (modelConfig?.cost?.fixed !== undefined &&
@@ -375,7 +384,7 @@ class MinimaxService extends baseAiGenProvider_service_1.BaseAiGenProviderServic
375
384
  // Image-gen — flat fixed × numImages (image-01).
376
385
  if (modelConfig?.cost?.fixed !== undefined &&
377
386
  modelConfig.type?.some((t) => t.endsWith("-to-image"))) {
378
- return (0, helpers_2.getCreditsFromCost)(modelConfig.cost.fixed * Math.max(1, numImages), !multiClip);
387
+ return (0, helpers_2.getCreditsFromCost)(modelConfig.cost.fixed * Math.max(1, numImages), !multiClip, creditFloor);
379
388
  }
380
389
  const cost = modelConfig.cost?.fixed ??
381
390
  modelConfig.cost?.table?.[resolution]?.[duration];
@@ -13,6 +13,6 @@ export declare class OpenaiService extends BaseAiGenProviderService {
13
13
  * reference images and an optional pixel mask).
14
14
  */
15
15
  generateImage(params: ImageGenerationParams): Promise<ImageGenerationResult>;
16
- getCreditUsed({ modelKey, resolution, duration, multiClip, numImages, quality, }: CreditUsageParams): number;
16
+ getCreditUsed({ modelKey, resolution, duration, multiClip, numImages, quality, creditFloor, }: CreditUsageParams): number;
17
17
  }
18
18
  //# sourceMappingURL=openai.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/openai/openai.service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,MAAM,CAAS;;IAQjB,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA0E3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsC3C,YAAY,CAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;IA2ChC;;;;OAIG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA6HjC,aAAa,CAAC,EACZ,QAAQ,EACR,UAAuB,EACvB,QAAY,EACZ,SAAiB,EACjB,SAAa,EACb,OAAO,GACR,EAAE,iBAAiB,GAAG,MAAM;CAoB9B"}
1
+ {"version":3,"file":"openai.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/openai/openai.service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,MAAM,CAAS;;IAQjB,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAwF3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsC3C,YAAY,CAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;IA2ChC;;;;OAIG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA6HjC,aAAa,CAAC,EACZ,QAAQ,EACR,UAAuB,EACvB,QAAY,EACZ,SAAiB,EACjB,SAAa,EACb,OAAO,EACP,WAAW,GACZ,EAAE,iBAAiB,GAAG,MAAM;CAqB9B"}
@@ -108,7 +108,17 @@ class OpenaiService extends baseAiGenProvider_service_1.BaseAiGenProviderService
108
108
  throw new errors_1.UserFacingError(message, errors_1.USER_FACING_ERROR_CODES.PROVIDER_AUTH_ERROR);
109
109
  }
110
110
  if (status === 429) {
111
- throw new errors_1.UserFacingError(message, errors_1.USER_FACING_ERROR_CODES.VIDEO_PROVIDER_RATE_LIMITED);
111
+ // OpenAI returns 429 for BOTH transient throttling AND hard account
112
+ // billing/quota depletion. Only the latter is ops-actionable (top up the
113
+ // account) and must page — `insufficient_quota` is the depletion marker
114
+ // (exposed on err.code / err.type). Misclassifying it as a plain rate
115
+ // limit is exactly how a depleted account fails silently.
116
+ const oaCode = err?.code ?? err?.error?.code ?? err?.type ?? err?.error?.type ?? "";
117
+ const isQuota = /insufficient_quota|billing|exceeded_current_quota/i.test(oaCode) ||
118
+ /quota|billing|insufficient/i.test(message);
119
+ throw new errors_1.UserFacingError(message, isQuota
120
+ ? errors_1.USER_FACING_ERROR_CODES.ACCOUNT_QUOTA_EXCEEDED
121
+ : errors_1.USER_FACING_ERROR_CODES.VIDEO_PROVIDER_RATE_LIMITED);
112
122
  }
113
123
  throw err;
114
124
  }
@@ -312,13 +322,13 @@ class OpenaiService extends baseAiGenProvider_service_1.BaseAiGenProviderService
312
322
  imageUrls: urls.length > 1 ? urls : undefined,
313
323
  };
314
324
  }
315
- getCreditUsed({ modelKey, resolution = "720x1280", duration = 5, multiClip = false, numImages = 1, quality, }) {
325
+ getCreditUsed({ modelKey, resolution = "720x1280", duration = 5, multiClip = false, numImages = 1, quality, creditFloor, }) {
316
326
  const modelConfig = aiModels_1.aiModelConfigs[modelKey];
317
327
  // Image-gen — fixed per-image cost; quality scales gpt-image price (low=0.5×,
318
328
  // medium=1×, high=4×, auto≈medium).
319
329
  if (modelConfig?.cost?.fixed !== undefined) {
320
330
  const qualityMultiplier = quality === "high" ? 4 : quality === "low" ? 0.5 : 1;
321
- return (0, utils_1.getCreditsFromCost)(modelConfig.cost.fixed * Math.max(1, numImages) * qualityMultiplier, !multiClip);
331
+ return (0, utils_1.getCreditsFromCost)(modelConfig.cost.fixed * Math.max(1, numImages) * qualityMultiplier, !multiClip, creditFloor);
322
332
  }
323
333
  const cost = modelConfig?.cost?.table?.[resolution]?.[duration];
324
334
  if (cost === undefined || cost === null) {
@@ -7,7 +7,7 @@ export declare class RunwayService extends BaseAiGenProviderService {
7
7
  private request;
8
8
  generateVideo(params: VideoGenerationParams): Promise<VideoGenerationResult>;
9
9
  checkVideoStatus({ task, outputFilename, outputFilePath, }: VideoStatusParams): Promise<VideoStatusResult>;
10
- getCreditUsed({ modelKey, duration, multiClip, numImages, aspectRatio }: CreditUsageParams): number;
10
+ getCreditUsed({ modelKey, duration, multiClip, numImages, aspectRatio, creditFloor }: CreditUsageParams): number;
11
11
  /**
12
12
  * Runway Gen-4 Image (text-to-image). Async — POST returns a task id,
13
13
  * we poll /tasks/{id} until SUCCEEDED, then rehost the time-limited URL
@@ -1 +1 @@
1
- {"version":3,"file":"runway.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/runway/runway.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAIlB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;YAUlB,OAAO;IAgCf,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA6G3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4DjD,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAY,EAAE,SAAiB,EAAE,SAAa,EAAE,WAAW,EAAE,EAAE,iBAAiB,GAAG,MAAM;IA0BnH;;;;;;;;OAQG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;CA0ElC"}
1
+ {"version":3,"file":"runway.service.d.ts","sourceRoot":"","sources":["../../../../../src/services/aiGen/providers/runway/runway.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAIlB,qBAAa,aAAc,SAAQ,wBAAwB;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;;YAUlB,OAAO;IAgCf,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IA6G3B,gBAAgB,CAAC,EACrB,IAAI,EACJ,cAAc,EACd,cAAyB,GAC1B,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4DjD,aAAa,CAAC,EAAE,QAAQ,EAAE,QAAY,EAAE,SAAiB,EAAE,SAAa,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,iBAAiB,GAAG,MAAM;IA0BhI;;;;;;;;OAQG;IACG,aAAa,CACjB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;CA0ElC"}
@@ -181,7 +181,7 @@ class RunwayService extends baseAiGenProvider_service_1.BaseAiGenProviderService
181
181
  // Still processing
182
182
  return { status: types_1.EVideoSceneStatus.PENDING };
183
183
  }
184
- getCreditUsed({ modelKey, duration = 5, multiClip = false, numImages = 1, aspectRatio }) {
184
+ getCreditUsed({ modelKey, duration = 5, multiClip = false, numImages = 1, aspectRatio, creditFloor }) {
185
185
  const modelConfig = aiModels_1.aiModelConfigs[modelKey];
186
186
  const cost = modelConfig?.cost;
187
187
  const applyFloor = !multiClip;
@@ -189,12 +189,12 @@ class RunwayService extends baseAiGenProvider_service_1.BaseAiGenProviderService
189
189
  if (cost?.perAspect && aspectRatio) {
190
190
  const perImage = cost.perAspect[aspectRatio] ?? cost.fixed;
191
191
  if (perImage !== undefined) {
192
- return (0, helpers_1.getCreditsFromCost)(perImage * Math.max(1, numImages), applyFloor);
192
+ return (0, helpers_1.getCreditsFromCost)(perImage * Math.max(1, numImages), applyFloor, creditFloor);
193
193
  }
194
194
  }
195
195
  // Image-gen — flat per-image cost (Runway Gen-4 Image / Turbo).
196
196
  if (cost?.fixed !== undefined) {
197
- return (0, helpers_1.getCreditsFromCost)(cost.fixed * Math.max(1, numImages), applyFloor);
197
+ return (0, helpers_1.getCreditsFromCost)(cost.fixed * Math.max(1, numImages), applyFloor, creditFloor);
198
198
  }
199
199
  const perSecond = cost?.perSecond;
200
200
  if (perSecond === undefined || perSecond === null) {
@@ -310,5 +310,13 @@ export interface CreditUsageParams {
310
310
  inputVideoDurationSec?: number;
311
311
  /** Image-gen — output resolution tier (e.g. Google nano-banana-pro "1K"/"2K"/"4K"). */
312
312
  imageSize?: string;
313
+ /**
314
+ * Per-op credit floor override. Only the image controller sets this (to
315
+ * MIN_CREDITS_PER_IMAGE_OP) so image-gen isn't billed against the standard
316
+ * 10-credit floor. Video/agent callers leave it unset; provider image
317
+ * branches forward it to getCreditsFromCost, where `undefined` falls back to
318
+ * MIN_CREDITS_PER_PAID_OP. See globals/creditUnit.ts.
319
+ */
320
+ creditFloor?: number;
313
321
  }
314
322
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/aiGen/providers/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/aiGen/providers/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bullmq.service.d.ts","sourceRoot":"","sources":["../../src/services/bullmq.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bullmq.service.d.ts","sourceRoot":"","sources":["../../src/services/bullmq.service.ts"],"names":[],"mappings":"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"}
@@ -288,16 +288,24 @@ class BullMQService {
288
288
  // else has settled.
289
289
  hardExit.unref();
290
290
  logger_1.logger.info("Shutting down BullMQ workers gracefully...", { hardTimeoutMs });
291
- for (const worker of this.workers) {
291
+ // Close workers CONCURRENTLY, not sequentially. worker.close() waits for
292
+ // that worker's in-flight job to finish; a sequential for-await loop
293
+ // blocks on the FIRST worker, so a single long job (a video/render can
294
+ // run ~15 min) holds open ALL 14 workers' blocking Redis connections for
295
+ // the entire drain. On a rolling deploy the new container is already up
296
+ // with its own 14 connections — keeping the old container's 14 alive for
297
+ // 15 min doubles us against the Redis `maxclients` cap and is exactly
298
+ // what surfaces "ERR max number of clients reached". Closing in parallel
299
+ // releases every IDLE worker's connection within milliseconds; only the
300
+ // genuinely-busy workers linger until their job completes.
301
+ await Promise.all(this.workers.map(async (worker) => {
292
302
  await worker.close();
293
303
  logger_1.logger.info(`Worker for queue closed`, { queueName: worker.name });
294
- }
304
+ }));
295
305
  // Close queues and the shared connection so blocking-client dups are
296
306
  // released cleanly (prevents lingering clients on the Redis side after
297
307
  // a rolling deploy / SIGTERM on Railway).
298
- for (const queue of this.queues.values()) {
299
- await queue.close();
300
- }
308
+ await Promise.all([...this.queues.values()].map((queue) => queue.close()));
301
309
  if (this.connection) {
302
310
  await this.connection.quit();
303
311
  }
@@ -0,0 +1,38 @@
1
+ import type { VideoBrief } from "../../schemas/brief.schema";
2
+ import type { IUserSubscription } from "../../models/user.model";
3
+ /**
4
+ * Free-plan single-generation flow (Task 5).
5
+ *
6
+ * A free user (no active paid subscription) starts with
7
+ * MIN_CREDITS_PER_PAID_OP credits — exactly enough for ONE floored paid
8
+ * operation. The per-op credit floor already makes that a single generation
9
+ * across video / image / avatar; this module covers the AGENT path, which has
10
+ * no floor (it bills actual per-scene cost) and would otherwise plan a
11
+ * multi-scene run far beyond the free balance — leaving a trial user unable to
12
+ * reach any finished video.
13
+ *
14
+ * The clamp below is the "hard minimal preset": force the planner toward the
15
+ * cheapest, shortest plan and hand it a hard spend cap equal to the free
16
+ * budget, so a free agent run is GUARANTEED to fit in the starting credits and
17
+ * always produce a final video to evaluate the product.
18
+ */
19
+ /** Starting credits for a free user — the single-generation budget. */
20
+ export declare const FREE_PLAN_CREDIT_BUDGET = 10;
21
+ /** Free budget expressed as the planner's USD spend cap (10 credits × $0.10). */
22
+ export declare const FREE_PLAN_MAX_SPEND_USD: number;
23
+ /** Whether free-plan limits apply to this subscription (i.e. it's NOT paid). */
24
+ export declare function isFreePlan(subscription: IUserSubscription | undefined | null): boolean;
25
+ /**
26
+ * Clamp a brief to the free-plan minimal preset before planning. Idempotent and
27
+ * non-destructive (returns a new object; never mutates the caller's brief).
28
+ *
29
+ * - `durationSec` / `lengthTier` → shortest, so the planner emits a couple of
30
+ * scenes rather than a 30–60s multi-scene run.
31
+ * - `tierBudget` → at most T1 (cheap AI), so the trial still showcases
32
+ * generation rather than dropping straight to stock.
33
+ * - `maxSpendUSD` → the free budget. The planner's L-6 hard cap then downgrades
34
+ * any over-budget scene (to T0/stock) so the total never exceeds the 10
35
+ * starting credits — the guarantee that the trial reaches a finished video.
36
+ */
37
+ export declare function clampBriefForFreePlan(brief: VideoBrief): VideoBrief;
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/freePlan/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGjE;;;;;;;;;;;;;;;GAeG;AAEH,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,KAA0B,CAAC;AAE/D,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,QAA2C,CAAC;AAKhF,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,YAAY,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAEtF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CASnE"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FREE_PLAN_MAX_SPEND_USD = exports.FREE_PLAN_CREDIT_BUDGET = void 0;
4
+ exports.isFreePlan = isFreePlan;
5
+ exports.clampBriefForFreePlan = clampBriefForFreePlan;
6
+ const creditUnit_1 = require("../../globals/creditUnit");
7
+ const renderTier_1 = require("../../utils/renderTier");
8
+ /**
9
+ * Free-plan single-generation flow (Task 5).
10
+ *
11
+ * A free user (no active paid subscription) starts with
12
+ * MIN_CREDITS_PER_PAID_OP credits — exactly enough for ONE floored paid
13
+ * operation. The per-op credit floor already makes that a single generation
14
+ * across video / image / avatar; this module covers the AGENT path, which has
15
+ * no floor (it bills actual per-scene cost) and would otherwise plan a
16
+ * multi-scene run far beyond the free balance — leaving a trial user unable to
17
+ * reach any finished video.
18
+ *
19
+ * The clamp below is the "hard minimal preset": force the planner toward the
20
+ * cheapest, shortest plan and hand it a hard spend cap equal to the free
21
+ * budget, so a free agent run is GUARANTEED to fit in the starting credits and
22
+ * always produce a final video to evaluate the product.
23
+ */
24
+ /** Starting credits for a free user — the single-generation budget. */
25
+ exports.FREE_PLAN_CREDIT_BUDGET = creditUnit_1.MIN_CREDITS_PER_PAID_OP;
26
+ /** Free budget expressed as the planner's USD spend cap (10 credits × $0.10). */
27
+ exports.FREE_PLAN_MAX_SPEND_USD = exports.FREE_PLAN_CREDIT_BUDGET * creditUnit_1.USD_PER_CREDIT;
28
+ /** Longest a free agent trial may run — keeps the plan to a couple of scenes. */
29
+ const FREE_PLAN_MAX_DURATION_SEC = 8;
30
+ /** Whether free-plan limits apply to this subscription (i.e. it's NOT paid). */
31
+ function isFreePlan(subscription) {
32
+ return !(0, renderTier_1.isPaidSubscription)(subscription);
33
+ }
34
+ /**
35
+ * Clamp a brief to the free-plan minimal preset before planning. Idempotent and
36
+ * non-destructive (returns a new object; never mutates the caller's brief).
37
+ *
38
+ * - `durationSec` / `lengthTier` → shortest, so the planner emits a couple of
39
+ * scenes rather than a 30–60s multi-scene run.
40
+ * - `tierBudget` → at most T1 (cheap AI), so the trial still showcases
41
+ * generation rather than dropping straight to stock.
42
+ * - `maxSpendUSD` → the free budget. The planner's L-6 hard cap then downgrades
43
+ * any over-budget scene (to T0/stock) so the total never exceeds the 10
44
+ * starting credits — the guarantee that the trial reaches a finished video.
45
+ */
46
+ function clampBriefForFreePlan(brief) {
47
+ const tierBudget = brief.tierBudget === "T0" ? "T0" : "T1";
48
+ return {
49
+ ...brief,
50
+ durationSec: Math.min(brief.durationSec ?? FREE_PLAN_MAX_DURATION_SEC, FREE_PLAN_MAX_DURATION_SEC),
51
+ lengthTier: "S1",
52
+ tierBudget,
53
+ maxSpendUSD: Math.min(brief.maxSpendUSD ?? exports.FREE_PLAN_MAX_SPEND_USD, exports.FREE_PLAN_MAX_SPEND_USD),
54
+ };
55
+ }
@@ -32,4 +32,5 @@ export * from "./socialFormat";
32
32
  export * from "./socialAI";
33
33
  export * from "./socialInsights";
34
34
  export * from "./socialAccounts";
35
+ export * from "./freePlan";
35
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,OAAO,CAAC;AACtB,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,OAAO,CAAC;AACtB,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
@@ -48,3 +48,4 @@ __exportStar(require("./socialFormat"), exports);
48
48
  __exportStar(require("./socialAI"), exports);
49
49
  __exportStar(require("./socialInsights"), exports);
50
50
  __exportStar(require("./socialAccounts"), exports);
51
+ __exportStar(require("./freePlan"), exports);
@@ -40,4 +40,27 @@ export declare const USER_FACING_ERROR_CODES: {
40
40
  readonly PROVIDER_UNAVAILABLE: "PROVIDER_UNAVAILABLE";
41
41
  };
42
42
  export type UserFacingErrorCode = keyof typeof USER_FACING_ERROR_CODES;
43
+ /**
44
+ * Canned, user-safe default message per code. The frontend translates by `code`
45
+ * via the `Toasts` namespace; these are the English fallback shown when a code
46
+ * isn't translated AND the safe text we store in `scene.errorMessage` so raw
47
+ * provider internals (billing consoles, API-key hints, request ids) never reach
48
+ * a user. Each reassures "you haven't been charged" where the failure is ours /
49
+ * the provider's, matching the credit-refund behaviour on failed jobs.
50
+ */
51
+ export declare const USER_FACING_ERROR_MESSAGES: Record<string, string>;
52
+ /** Friendly default for a code, or undefined if the code is unknown/unset. */
53
+ export declare function friendlyMessageForCode(code: string | undefined): string | undefined;
54
+ /**
55
+ * Display-boundary guard. Returns a message that is safe to show a user:
56
+ * - if `code` has a canned friendly message, always prefer it (provider text
57
+ * is never authoritative for display);
58
+ * - else, if the message contains provider-internal leak markers, strip them;
59
+ * if stripping leaves it too short / still internal, fall back to generic;
60
+ * - else return the message unchanged.
61
+ *
62
+ * This is the last line of defence against ANY provider (Google, Kling, Runway,
63
+ * …) leaking billing/console/internal text into a user-visible error.
64
+ */
65
+ export declare function sanitizeUserFacingMessage(message: string | undefined, code?: string): string;
43
66
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,iBAAiB,QAAQ;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,qEAAqE;IACrE,MAAM,IAAI;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAG7C;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;IAUlC,wFAAwF;;IAExF,qFAAqF;;IAErF,+FAA+F;;IAE/F,oGAAoG;;CAE5F,CAAC;AACX,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,uBAAuB,CAAC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,iBAAiB,QAAQ;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAM1C,qEAAqE;IACrE,MAAM,IAAI;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAG7C;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;IAUlC,wFAAwF;;IAExF,qFAAqF;;IAErF,+FAA+F;;IAE/F,oGAAoG;;CAE5F,CAAC;AACX,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,uBAAuB,CAAC;AAEvE;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA2B7D,CAAC;AAEF,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEnF;AAqBD;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAaR"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.USER_FACING_ERROR_CODES = exports.UserFacingError = void 0;
3
+ exports.USER_FACING_ERROR_MESSAGES = exports.USER_FACING_ERROR_CODES = exports.UserFacingError = void 0;
4
+ exports.friendlyMessageForCode = friendlyMessageForCode;
5
+ exports.sanitizeUserFacingMessage = sanitizeUserFacingMessage;
4
6
  /**
5
7
  * Thrown when an error should be shown to the user rather than retried/escalated.
6
8
  * These are logged as `warn` (Loki only) instead of `error` (Slack) to reduce noise.
@@ -45,3 +47,75 @@ exports.USER_FACING_ERROR_CODES = {
45
47
  /** Provider classified the request as unavailable (general service degradation, 5xx persistent). */
46
48
  PROVIDER_UNAVAILABLE: "PROVIDER_UNAVAILABLE",
47
49
  };
50
+ /**
51
+ * Canned, user-safe default message per code. The frontend translates by `code`
52
+ * via the `Toasts` namespace; these are the English fallback shown when a code
53
+ * isn't translated AND the safe text we store in `scene.errorMessage` so raw
54
+ * provider internals (billing consoles, API-key hints, request ids) never reach
55
+ * a user. Each reassures "you haven't been charged" where the failure is ours /
56
+ * the provider's, matching the credit-refund behaviour on failed jobs.
57
+ */
58
+ exports.USER_FACING_ERROR_MESSAGES = {
59
+ [exports.USER_FACING_ERROR_CODES.VIDEO_PROVIDER_RATE_LIMITED]: "Our video provider is handling a lot of requests right now and couldn't start your video. You haven't been charged — please try again in a few minutes.",
60
+ [exports.USER_FACING_ERROR_CODES.VIDEO_PROVIDER_HIGH_DEMAND]: "The video model is experiencing high demand right now. You haven't been charged — please try again in a few minutes.",
61
+ [exports.USER_FACING_ERROR_CODES.VIDEO_PROVIDER_TIMEOUT]: "Your video took too long to generate and timed out. You haven't been charged — please try again.",
62
+ [exports.USER_FACING_ERROR_CODES.ACCOUNT_QUOTA_EXCEEDED]: "We've hit a temporary capacity limit with this video model. You haven't been charged — please try again shortly, or pick a different model.",
63
+ [exports.USER_FACING_ERROR_CODES.PROVIDER_UNAVAILABLE]: "The video service is temporarily unavailable. You haven't been charged — please try again in a few minutes.",
64
+ [exports.USER_FACING_ERROR_CODES.PROVIDER_AUTH_ERROR]: "Something went wrong on our side starting your video. You haven't been charged — please try again, and contact support if it keeps happening.",
65
+ [exports.USER_FACING_ERROR_CODES.TTS_PROVIDER_TIMEOUT]: "The voiceover service timed out. Please try again.",
66
+ [exports.USER_FACING_ERROR_CODES.TTS_PROVIDER_UNAVAILABLE]: "The voiceover service is temporarily unavailable. Please try again in a few minutes.",
67
+ [exports.USER_FACING_ERROR_CODES.PROMPT_TOO_LONG]: "Your prompt is too long for this model. Please shorten it and try again.",
68
+ [exports.USER_FACING_ERROR_CODES.PROMPT_INVALID]: "Your prompt was rejected by the model. Please simplify or rephrase it and try again.",
69
+ [exports.USER_FACING_ERROR_CODES.INPUT_IMAGE_REJECTED]: "Your input image was rejected. Please try a different image.",
70
+ [exports.USER_FACING_ERROR_CODES.CONTENT_POLICY_VIOLATION]: "Your prompt was flagged by the model's safety filters. Please rephrase and try again.",
71
+ [exports.USER_FACING_ERROR_CODES.CAPABILITY_MISMATCH]: "This combination of settings isn't supported by the selected model. Please adjust your options and try again.",
72
+ };
73
+ /** Friendly default for a code, or undefined if the code is unknown/unset. */
74
+ function friendlyMessageForCode(code) {
75
+ return code ? exports.USER_FACING_ERROR_MESSAGES[code] : undefined;
76
+ }
77
+ // Detection patterns (non-global, for .test) for provider-internal detail that
78
+ // must never be shown to a user: billing/console URLs, dashboards, API-key
79
+ // hints, and request ids. Kept in sync with REPLACE_PATTERNS below.
80
+ const LEAK_DETECT_PATTERNS = [
81
+ /https?:\/\/\S+/i,
82
+ /ai\.studio|aistudio\.google|console\.cloud\.google|platform\.openai|dashboard/i,
83
+ /prepayment|\bbilling\b|quota project|API[_ ]?key|service account|GOOGLE_[A-Z_]+/i,
84
+ /Request id:/i,
85
+ ];
86
+ // Replacement patterns (global) used to strip leaked fragments when we have no
87
+ // canned message to substitute.
88
+ const LEAK_REPLACE_PATTERNS = [
89
+ /https?:\/\/\S+/gi,
90
+ /\s*Request id:.*$/gi,
91
+ ];
92
+ const GENERIC_USER_FACING_MESSAGE = "Something went wrong generating your video. You haven't been charged — please try again, and contact support if it keeps happening.";
93
+ /**
94
+ * Display-boundary guard. Returns a message that is safe to show a user:
95
+ * - if `code` has a canned friendly message, always prefer it (provider text
96
+ * is never authoritative for display);
97
+ * - else, if the message contains provider-internal leak markers, strip them;
98
+ * if stripping leaves it too short / still internal, fall back to generic;
99
+ * - else return the message unchanged.
100
+ *
101
+ * This is the last line of defence against ANY provider (Google, Kling, Runway,
102
+ * …) leaking billing/console/internal text into a user-visible error.
103
+ */
104
+ function sanitizeUserFacingMessage(message, code) {
105
+ const canned = friendlyMessageForCode(code);
106
+ if (canned)
107
+ return canned;
108
+ if (!message)
109
+ return GENERIC_USER_FACING_MESSAGE;
110
+ const hasLeak = LEAK_DETECT_PATTERNS.some((re) => re.test(message));
111
+ if (!hasLeak)
112
+ return message;
113
+ let scrubbed = message;
114
+ for (const re of LEAK_REPLACE_PATTERNS)
115
+ scrubbed = scrubbed.replace(re, "");
116
+ scrubbed = scrubbed.replace(/\s{2,}/g, " ").trim();
117
+ // If, after stripping, the remaining text still trips a detector or is too
118
+ // short to be meaningful, don't risk it — use the generic message.
119
+ const stillLeaks = LEAK_DETECT_PATTERNS.some((re) => re.test(scrubbed));
120
+ return !stillLeaks && scrubbed.length >= 12 ? scrubbed : GENERIC_USER_FACING_MESSAGE;
121
+ }
@@ -4,7 +4,14 @@ import { ETextGenModels } from "../globals";
4
4
  export declare const getPlanTypeById: (priceId: string) => ESUBSCRIPTION_PLANS | null;
5
5
  export declare const getFreqById: (priceId: string) => ERENEWAL_FREQUENCY | null;
6
6
  export declare const getPriceIdByType: (type: ESUBSCRIPTION_PLANS, freq?: ERENEWAL_FREQUENCY) => string;
7
- export declare const getCreditsFromCost: (cost: number, applyFloor?: boolean) => number;
7
+ export declare const getCreditsFromCost: (cost: number, applyFloor?: boolean,
8
+ /**
9
+ * Per-op minimum when `applyFloor`. Defaults to MIN_CREDITS_PER_PAID_OP (10).
10
+ * Image-gen passes a lower floor (MIN_CREDITS_PER_IMAGE_OP) so cheap images
11
+ * aren't billed as if they cost $1 — see creditUnit.ts. Callers other than
12
+ * the image path leave it unset and keep the standard floor.
13
+ */
14
+ floor?: number) => number;
8
15
  /**
9
16
  * Guard against silent under-billing when a model's `cost` block is missing
10
17
  * from `aiModelConfigs`. Every provider's `getCreditUsed()` historically fell
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,KACd,mBAAmB,GAAG,IASxB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,KAAG,kBAAkB,GAAG,IASlE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,MAAM,mBAAmB,EACzB,OAAM,kBAA+C,WAgBtD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,oBAAiB,KAAG,MAQpE,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,MAAM,MAAM,GAAG,SAAS,EACxB,UAAU,MAAM,KACf,MASF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,2BAA2B,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAInF,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,kBAAkB,GAAG,MAAM,CAEnF;AAOD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,GACX,MAAM,6CAA6C,CAAC;AAErD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,SAAQ,EACf,QAAQ,SAAM,oBAQf;AAGD,wBAAsB,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,SAAS,EAAE,CAAC,CAAC;IACb,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAGxB,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AA0DrB,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAatE"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,KACd,mBAAmB,GAAG,IASxB,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,KAAG,kBAAkB,GAAG,IASlE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,MAAM,mBAAmB,EACzB,OAAM,kBAA+C,WAgBtD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,oBAAiB;AACjB;;;;;GAKG;AACH,QAAO,MAAgC,KACtC,MAQF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,MAAM,MAAM,GAAG,SAAS,EACxB,UAAU,MAAM,KACf,MASF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,2BAA2B,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAInF,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,kBAAkB,GAAG,MAAM,CAEnF;AAOD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,GACX,MAAM,6CAA6C,CAAC;AAErD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,SAAQ,EACf,QAAQ,SAAM,oBAQf;AAGD,wBAAsB,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,SAAS,EAAE,CAAC,CAAC;IACb,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAGxB,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AA0DrB,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAatE"}
@@ -50,13 +50,20 @@ const getPriceIdByType = (type, freq = types_1.ERENEWAL_FREQUENCY.MONTHLY) => {
50
50
  : planDetails?.monthly?.id;
51
51
  };
52
52
  exports.getPriceIdByType = getPriceIdByType;
53
- const getCreditsFromCost = (cost, applyFloor = true) => {
53
+ const getCreditsFromCost = (cost, applyFloor = true,
54
+ /**
55
+ * Per-op minimum when `applyFloor`. Defaults to MIN_CREDITS_PER_PAID_OP (10).
56
+ * Image-gen passes a lower floor (MIN_CREDITS_PER_IMAGE_OP) so cheap images
57
+ * aren't billed as if they cost $1 — see creditUnit.ts. Callers other than
58
+ * the image path leave it unset and keep the standard floor.
59
+ */
60
+ floor = creditUnit_1.MIN_CREDITS_PER_PAID_OP) => {
54
61
  if (cost <= 0)
55
62
  return 0;
56
63
  // Canonical rate (see globals/creditUnit.ts). USD_PER_CREDIT is cost basis;
57
64
  // the 2× user markup lives in plan pricing, not here.
58
65
  const credits = Math.ceil(cost / creditUnit_1.USD_PER_CREDIT);
59
- return applyFloor ? Math.max(credits, creditUnit_1.MIN_CREDITS_PER_PAID_OP) : credits;
66
+ return applyFloor ? Math.max(credits, floor) : credits;
60
67
  };
61
68
  exports.getCreditsFromCost = getCreditsFromCost;
62
69
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vidspotai-shared",
3
- "version": "1.0.87",
3
+ "version": "1.0.88",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "exports": {