vidspotai-shared 1.0.86 → 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 (82) 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/schemas/videoPlan.schema.d.ts +1 -0
  18. package/lib/schemas/videoPlan.schema.d.ts.map +1 -1
  19. package/lib/schemas/videoPlan.schema.js +8 -0
  20. package/lib/services/agent/beatSnap.d.ts +3 -0
  21. package/lib/services/agent/beatSnap.d.ts.map +1 -1
  22. package/lib/services/agent/beatSnap.js +5 -0
  23. package/lib/services/agent/executor/core.d.ts +6 -0
  24. package/lib/services/agent/executor/core.d.ts.map +1 -1
  25. package/lib/services/agent/executor/core.js +45 -0
  26. package/lib/services/agent/executor/types.d.ts +29 -0
  27. package/lib/services/agent/executor/types.d.ts.map +1 -1
  28. package/lib/services/agent/executor/visual.d.ts.map +1 -1
  29. package/lib/services/agent/executor/visual.js +7 -0
  30. package/lib/services/agent/index.d.ts +1 -0
  31. package/lib/services/agent/index.d.ts.map +1 -1
  32. package/lib/services/agent/index.js +1 -0
  33. package/lib/services/agent/planner/plannerMessages.d.ts.map +1 -1
  34. package/lib/services/agent/planner/plannerMessages.js +7 -0
  35. package/lib/services/agent/resnapVo.d.ts +51 -0
  36. package/lib/services/agent/resnapVo.d.ts.map +1 -0
  37. package/lib/services/agent/resnapVo.js +102 -0
  38. package/lib/services/agent/tools/planVideo.tool.d.ts +1 -0
  39. package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -1
  40. package/lib/services/aiGen/providers/alibaba/alibaba.d.ts +1 -1
  41. package/lib/services/aiGen/providers/alibaba/alibaba.d.ts.map +1 -1
  42. package/lib/services/aiGen/providers/alibaba/alibaba.js +2 -2
  43. package/lib/services/aiGen/providers/bytedance/bytedance.service.d.ts.map +1 -1
  44. package/lib/services/aiGen/providers/bytedance/bytedance.service.js +8 -0
  45. package/lib/services/aiGen/providers/google/google.service.d.ts +1 -1
  46. package/lib/services/aiGen/providers/google/google.service.d.ts.map +1 -1
  47. package/lib/services/aiGen/providers/google/google.service.js +71 -16
  48. package/lib/services/aiGen/providers/google/googleErrors.d.ts +28 -0
  49. package/lib/services/aiGen/providers/google/googleErrors.d.ts.map +1 -1
  50. package/lib/services/aiGen/providers/google/googleErrors.js +75 -2
  51. package/lib/services/aiGen/providers/google/googleKeyPool.d.ts +8 -1
  52. package/lib/services/aiGen/providers/google/googleKeyPool.d.ts.map +1 -1
  53. package/lib/services/aiGen/providers/google/googleKeyPool.js +77 -9
  54. package/lib/services/aiGen/providers/kling/klingImage.service.d.ts +1 -1
  55. package/lib/services/aiGen/providers/kling/klingImage.service.d.ts.map +1 -1
  56. package/lib/services/aiGen/providers/kling/klingImage.service.js +3 -3
  57. package/lib/services/aiGen/providers/minimax/minimax.service.d.ts +1 -1
  58. package/lib/services/aiGen/providers/minimax/minimax.service.d.ts.map +1 -1
  59. package/lib/services/aiGen/providers/minimax/minimax.service.js +16 -7
  60. package/lib/services/aiGen/providers/openai/openai.service.d.ts +1 -1
  61. package/lib/services/aiGen/providers/openai/openai.service.d.ts.map +1 -1
  62. package/lib/services/aiGen/providers/openai/openai.service.js +13 -3
  63. package/lib/services/aiGen/providers/runway/runway.service.d.ts +1 -1
  64. package/lib/services/aiGen/providers/runway/runway.service.d.ts.map +1 -1
  65. package/lib/services/aiGen/providers/runway/runway.service.js +3 -3
  66. package/lib/services/aiGen/providers/types.d.ts +8 -0
  67. package/lib/services/aiGen/providers/types.d.ts.map +1 -1
  68. package/lib/services/bullmq.service.d.ts.map +1 -1
  69. package/lib/services/bullmq.service.js +13 -5
  70. package/lib/services/freePlan/index.d.ts +38 -0
  71. package/lib/services/freePlan/index.d.ts.map +1 -0
  72. package/lib/services/freePlan/index.js +55 -0
  73. package/lib/services/index.d.ts +1 -0
  74. package/lib/services/index.d.ts.map +1 -1
  75. package/lib/services/index.js +1 -0
  76. package/lib/utils/errors.d.ts +23 -0
  77. package/lib/utils/errors.d.ts.map +1 -1
  78. package/lib/utils/errors.js +75 -1
  79. package/lib/utils/helpers.d.ts +8 -1
  80. package/lib/utils/helpers.d.ts.map +1 -1
  81. package/lib/utils/helpers.js +9 -2
  82. package/package.json +1 -1
@@ -44,6 +44,59 @@ class GoogleKeyPool {
44
44
  get size() {
45
45
  return this.entries.length;
46
46
  }
47
+ /** All key ids in priority order (for failover bookkeeping by the caller). */
48
+ get keyIds() {
49
+ return this.entries.map((e) => e.id);
50
+ }
51
+ // ── Circuit breaker ────────────────────────────────────────────────────────
52
+ // A key whose BILLING is depleted (or whose auth is revoked) keeps returning
53
+ // the same error on every submit, but our quota counters (which only track
54
+ // OUR request rate) have no way to know that — so routing would keep sending
55
+ // jobs into the dead key. When generateVideo's submit fails with an account-
56
+ // level error it calls markDepleted(); pickForSubmit then skips the key until
57
+ // the TTL lapses and we re-probe it. The flag lives in Redis so every worker
58
+ // shares one view (and it auto-clears if Redis is wiped — fail-open).
59
+ depletedKey(id) {
60
+ return `gkpool:${id}:depleted`;
61
+ }
62
+ /** Circuit-break a key for `ttlSeconds` after an account-level submit failure. */
63
+ async markDepleted(id, ttlSeconds, reason) {
64
+ const client = redis_service_1.redis.getClient();
65
+ if (!client)
66
+ return; // no Redis → fail-open (caller still fails over in-loop)
67
+ try {
68
+ await client.set(this.depletedKey(id), reason, "EX", Math.max(60, ttlSeconds));
69
+ logger_1.logger.warn("googleKeyPool: key circuit-broken (skipping until re-probe)", {
70
+ keyId: id,
71
+ ttlSeconds,
72
+ reason,
73
+ });
74
+ }
75
+ catch (err) {
76
+ logger_1.logger.warn("googleKeyPool: markDepleted failed", {
77
+ keyId: id,
78
+ err: err instanceof Error ? err.message : String(err),
79
+ });
80
+ }
81
+ }
82
+ /** Ids currently circuit-broken. Best-effort; empty on Redis trouble (fail-open). */
83
+ async depletedIds() {
84
+ const out = new Set();
85
+ const client = redis_service_1.redis.getClient();
86
+ if (!client || this.entries.length <= 1)
87
+ return out;
88
+ try {
89
+ const flags = await Promise.all(this.entries.map((e) => client.get(this.depletedKey(e.id))));
90
+ this.entries.forEach((e, i) => {
91
+ if (flags[i])
92
+ out.add(e.id);
93
+ });
94
+ }
95
+ catch {
96
+ // fail-open: treat all as healthy
97
+ }
98
+ return out;
99
+ }
47
100
  /** The highest-priority key's client (index 0). */
48
101
  get primaryClient() {
49
102
  return this.entries[0].client;
@@ -63,14 +116,25 @@ class GoogleKeyPool {
63
116
  * if Redis is down or all are at cap (the aggregate model-level gate should
64
117
  * have prevented the latter).
65
118
  */
66
- async pickForSubmit(modelId, baselineMin, baselineDay) {
119
+ async pickForSubmit(modelId, baselineMin, baselineDay, skip) {
67
120
  if (this.entries.length === 1)
68
121
  return this.entries[0];
69
122
  const client = redis_service_1.redis.getClient();
70
- if (!client)
71
- return this.entries[0];
123
+ if (!client) {
124
+ // No Redis routing — honor the caller's failover skip set if possible.
125
+ return this.entries.find((e) => !skip?.has(e.id)) ?? this.entries[0];
126
+ }
127
+ // Exclude keys the caller already tried this job (failover) AND keys that
128
+ // are circuit-broken (depleted billing / revoked auth). If that leaves
129
+ // nothing, fall back to the full list so we always return *some* key.
130
+ const depleted = await this.depletedIds();
131
+ const excluded = new Set([...(skip ?? []), ...depleted]);
132
+ const pool = this.entries.filter((e) => !excluded.has(e.id));
133
+ const candidates = pool.length ? pool : this.entries;
134
+ if (candidates.length === 1)
135
+ return candidates[0];
72
136
  const date = utcDateKey();
73
- for (const entry of this.entries) {
137
+ for (const entry of candidates) {
74
138
  try {
75
139
  const perKeyMinLimit = (0, googleApiKeys_1.scaleLimitForTier)(baselineMin, entry.tier, "rpm");
76
140
  const perKeyDayLimit = (0, googleApiKeys_1.scaleLimitForTier)(baselineDay, entry.tier, "rpd");
@@ -96,14 +160,18 @@ class GoogleKeyPool {
96
160
  });
97
161
  }
98
162
  }
99
- // All at cap / errored — use the primary and let Google's own 429 + the
100
- // provider-fallback chain handle it.
101
- logger_1.logger.warn("googleKeyPool: no key with headroom — using primary", {
163
+ // All at cap / errored — use the highest-priority *candidate* (already
164
+ // excludes failover-tried + circuit-broken keys) and let Google's own 429 +
165
+ // the provider-fallback chain handle it.
166
+ const fallback = candidates[0];
167
+ logger_1.logger.warn("googleKeyPool: no key with headroom — using best candidate", {
102
168
  modelId,
103
169
  poolSize: this.entries.length,
170
+ candidates: candidates.length,
171
+ keyId: fallback.id,
104
172
  });
105
- await this.consume(this.entries[0], modelId, date).catch(() => undefined);
106
- return this.entries[0];
173
+ await this.consume(fallback, modelId, date).catch(() => undefined);
174
+ return fallback;
107
175
  }
108
176
  /** Best-effort increment of a key's per-day + per-minute routing counters. */
109
177
  async consume(entry, modelId, date) {
@@ -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"}