backend-manager 5.11.7 → 5.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -96,7 +96,9 @@ URL citations live in the returned `output` (message content) as `annotations` o
96
96
 
97
97
  `provider: 'test'` is the AI analog of the `test` payment processor: a first-class provider that suites drive with directives in the LAST user message, so consumer routes exercise their full loop (Firestore writes, usage, locks, tool execution) against the real emulator with zero paid API calls. It **refuses to run outside development/testing**.
98
98
 
99
- Directives form a sequence consumed across loop turns (call N executes directive N-1, indexed by assistant turns after the last user turn). Directive values must not contain `]]` internally (a trailing JSON `]` is fine):
99
+ Directives form a sequence consumed across loop turns (call N executes directive N-1, indexed by assistant turns after the last user turn). Directive values must not contain `]]` internally (a trailing JSON `]` is fine).
100
+
101
+ The directive source is resolved in order: the last `messages[]` user turn → `message.content` → **`message.settings` values** (flattened raw). That last fallback makes path-based routes (`message: { path, settings }` — the idiomatic BEM prompt-template style) scriptable as-is: embed the directive in whatever request field gets interpolated into the template (e.g. a chat's `message`, a quiz's `topic`).
100
102
 
101
103
  | Directive | Behavior |
102
104
  |---|---|
@@ -27,6 +27,8 @@ For anonymous-to-owner billing, call `setUser()` BEFORE `validate()` — validat
27
27
 
28
28
  Limits are always specified as **monthly** values in product config (e.g., `limits.requests = 100` means 100/month).
29
29
 
30
+ **Negative limits are unlimited.** `limits.requests = -1` means the metric is never rate-limited for that product — `validate()` always resolves and no daily caps apply. A limit of `0` (or a metric missing from `limits`) always rejects.
31
+
30
32
  By default, limits are enforced with **daily caps** to prevent users from burning their entire monthly quota in a single day. Two checks are applied:
31
33
 
32
34
  1. **Flat daily cap**: `ceil(monthlyLimit / daysInMonth)` — max uses per day
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "backend-manager",
3
- "version": "5.11.7",
3
+ "version": "5.12.0",
4
4
  "description": "Quick tools for developing Firebase functions",
5
5
  "main": "src/manager/index.js",
6
6
  "files": [
@@ -170,6 +170,13 @@ Usage.prototype.validate = function (name, options) {
170
170
  return _reject();
171
171
  }
172
172
 
173
+ // Negative limits are unlimited (product config convention: -1)
174
+ if (allowed < 0) {
175
+ self.log(`Usage.validate(): Unlimited limit (${allowed}) for ${name}`);
176
+
177
+ return resolve(true);
178
+ }
179
+
173
180
  // Check if they have a white list key
174
181
  const hasWhitelistKey = self.options.whitelistKeys.some((key) => key && key === self?.user?.api?.privateKey);
175
182
  if (hasWhitelistKey) {
@@ -367,9 +374,9 @@ Usage.prototype.getDailyAllowance = function (name) {
367
374
  return null;
368
375
  }
369
376
 
370
- // Get the monthly limit
377
+ // Get the monthly limit (negative limits are unlimited — no daily cap)
371
378
  const monthlyLimit = self.getLimit(name);
372
- if (!monthlyLimit) {
379
+ if (!monthlyLimit || monthlyLimit < 0) {
373
380
  return null;
374
381
  }
375
382
 
@@ -55,7 +55,12 @@ TestProvider.prototype.request = async function (options) {
55
55
 
56
56
  const messages = Array.isArray(options.messages) ? options.messages : [];
57
57
  const lastUserMessage = [...messages].reverse().find((m) => m.role === 'user' && typeof m.content === 'string');
58
- const scriptSource = lastUserMessage?.content || stringifyLoose(options.message?.content) || '';
58
+ // Path-based messages ({ path, settings }) are rendered inside the real
59
+ // providers, so directives arrive via the settings values — read them too.
60
+ const scriptSource = lastUserMessage?.content
61
+ || stringifyLoose(options.message?.content)
62
+ || stringifyLoose(options.message?.settings)
63
+ || '';
59
64
 
60
65
  const { steps, cleanText } = parseScript(scriptSource);
61
66
 
@@ -230,6 +235,15 @@ function stringifyLoose(content) {
230
235
  return content.map((c) => c?.text || '').join('\n');
231
236
  }
232
237
 
238
+ // Plain objects (e.g. prompt-template settings) flatten to their raw values
239
+ // so directives embedded in them stay parseable (JSON.stringify would escape
240
+ // the quotes inside a directive's JSON payload)
241
+ if (content && typeof content === 'object') {
242
+ return Object.values(content)
243
+ .map((value) => (typeof value === 'string' ? value : `${value}`))
244
+ .join('\n');
245
+ }
246
+
233
247
  return content ? String(content) : '';
234
248
  }
235
249
 
@@ -12,8 +12,10 @@
12
12
  "000webmail.dyndns.ddnss.de",
13
13
  "000webmail.dyndns1.de",
14
14
  "000webmail.home-webserver.de",
15
+ "00jac.com",
15
16
  "01022.hk",
16
17
  "01130.hk",
18
+ "020307.xyz",
17
19
  "027168.com",
18
20
  "045692.xyz",
19
21
  "062e.com",
@@ -51,8 +53,10 @@
51
53
  "10mail.xyz",
52
54
  "10minemail.com",
53
55
  "10minmail.de",
56
+ "10minmail.org",
54
57
  "10minut.com.pl",
55
58
  "10minut.xyz",
59
+ "10minute.email",
56
60
  "10minutemail.be",
57
61
  "10minutemail.cf",
58
62
  "10minutemail.co.uk",
@@ -246,6 +250,7 @@
246
250
  "55hosting.net",
247
251
  "5ghgfhfghfgh.tk",
248
252
  "5gramos.com",
253
+ "5ixmonth.xyz",
249
254
  "5july.org",
250
255
  "5mail.cf",
251
256
  "5mail.ga",
@@ -254,6 +259,7 @@
254
259
  "5semail.com",
255
260
  "5tb.in",
256
261
  "5x25.com",
262
+ "5xu.vn",
257
263
  "5y.loseyourip.com",
258
264
  "5yaochu.top",
259
265
  "5ymail.com",
@@ -269,6 +275,7 @@
269
275
  "681mail.com",
270
276
  "689345.xyz",
271
277
  "6974.click",
278
+ "6gdfg.zone.id",
272
279
  "6hjgjhgkilkj.tk",
273
280
  "6ip.us",
274
281
  "6mail.cf",
@@ -417,6 +424,7 @@
417
424
  "adroh.com",
418
425
  "ads24h.top",
419
426
  "adsd.org",
427
+ "adsensekorea.com",
420
428
  "adubiz.info",
421
429
  "adult-work.info",
422
430
  "adv-dep-eng.jo3.org",
@@ -476,6 +484,7 @@
476
484
  "ahk.jp",
477
485
  "ahmedkhlef.com",
478
486
  "ahvin.com",
487
+ "ai100999.com",
479
488
  "aiaccount.click",
480
489
  "aiapes.publicvm.com",
481
490
  "aibase.bond",
@@ -634,6 +643,7 @@
634
643
  "animesos.com",
635
644
  "aniross.com",
636
645
  "anit.ro",
646
+ "ankiclub.space",
637
647
  "ann.qzz.io",
638
648
  "annd.us",
639
649
  "annnekkk.com",
@@ -672,6 +682,7 @@
672
682
  "apedesigns.jo3.org",
673
683
  "apedesigns.linkpc.net",
674
684
  "apes-ai.linkpc.net",
685
+ "apexnovaser.com",
675
686
  "apexone.top",
676
687
  "apfelkorps.de",
677
688
  "aphlog.com",
@@ -693,12 +704,14 @@
693
704
  "arapgege.app",
694
705
  "arapps.me",
695
706
  "arcadein.com",
707
+ "arcadium.lat",
696
708
  "arcentra.cfd",
697
709
  "ardsp.shop",
698
710
  "arduino.hk",
699
711
  "arenahiveai.com",
700
712
  "ares.edu.pl",
701
713
  "ariaz.jetzt",
714
+ "arkoo.site",
702
715
  "armyspy.com",
703
716
  "aron.us",
704
717
  "arroisijewellery.com",
@@ -748,6 +761,7 @@
748
761
  "au1688x.us",
749
762
  "aubady.com",
750
763
  "augmentationtechnology.com",
764
+ "aumails.us",
751
765
  "auralith.cfd",
752
766
  "ausgefallen.info",
753
767
  "auth2fa.com",
@@ -910,17 +924,20 @@
910
924
  "badoop.com",
911
925
  "badopsec.lol",
912
926
  "badpotato.tk",
927
+ "baechecker.com",
913
928
  "bahlill.cfd",
914
929
  "baicai1145.online",
915
930
  "baicai1145.shop",
916
931
  "baidoxe.com",
917
932
  "baileybridge.org",
933
+ "baipiaodashen.cloud-ip.cc",
918
934
  "baiyucraft.sbs",
919
935
  "baizoto.shop",
920
936
  "bakalos.dpdns.org",
921
937
  "balaket.com",
922
938
  "balawo.com",
923
939
  "banana.linkpc.net",
940
+ "banancaocap.com",
924
941
  "bandtoo.com",
925
942
  "bangban.uk",
926
943
  "bangdieukhien.net",
@@ -930,6 +947,7 @@
930
947
  "bank-opros1.ru",
931
948
  "bankinnepal.com",
932
949
  "banri.xyz",
950
+ "bar-ton.store",
933
951
  "bareed.ws",
934
952
  "barnrestaurant.pro",
935
953
  "barooko.com",
@@ -1017,6 +1035,7 @@
1017
1035
  "bgtmail.com",
1018
1036
  "bgx.ro",
1019
1037
  "bgyiacczy.top",
1038
+ "bhana.xyz",
1020
1039
  "bhap.me",
1021
1040
  "bheps.com",
1022
1041
  "bhuxp.org",
@@ -1090,6 +1109,7 @@
1090
1109
  "bocas.tech",
1091
1110
  "boerakemail.com",
1092
1111
  "bofthew.com",
1112
+ "bokgumail.kr",
1093
1113
  "bomnet.net",
1094
1114
  "bonobo.email",
1095
1115
  "boofx.com",
@@ -1168,6 +1188,7 @@
1168
1188
  "buccalmassage.ru",
1169
1189
  "budaya-tionghoa.com",
1170
1190
  "budayationghoa.com",
1191
+ "buddyfly.top",
1171
1192
  "buffemail.com",
1172
1193
  "bugfoo.com",
1173
1194
  "bugmenever.com",
@@ -1262,11 +1283,13 @@
1262
1283
  "capcud.shop",
1263
1284
  "capcut.digital",
1264
1285
  "capcut.sbs",
1286
+ "capcut.space",
1265
1287
  "capcut02.shop",
1266
1288
  "capcutku.io",
1267
1289
  "capcutmeflo.shop",
1268
1290
  "capcutpro.click",
1269
1291
  "capcutpro.dev",
1292
+ "capcvt.es",
1270
1293
  "capitalistdilemma.com",
1271
1294
  "caprasolver.xyz",
1272
1295
  "captus.cyou",
@@ -1426,6 +1449,7 @@
1426
1449
  "clearhabitpath.com",
1427
1450
  "clearwatermail.info",
1428
1451
  "click-email.com",
1452
+ "clickcore99.click",
1429
1453
  "clickdeal.co",
1430
1454
  "clipmail.eu",
1431
1455
  "clixser.com",
@@ -1528,6 +1552,7 @@
1528
1552
  "coolimpool.org",
1529
1553
  "cooljump.org",
1530
1554
  "copyhome.win",
1555
+ "coralhost.my",
1531
1556
  "corbyrise.com",
1532
1557
  "coreclip.com",
1533
1558
  "corhash.net",
@@ -1626,6 +1651,7 @@
1626
1651
  "dahewushi.eu.cc",
1627
1652
  "daibond.info",
1628
1653
  "daily-email.com",
1654
+ "dailynove.com",
1629
1655
  "dailynutria.com",
1630
1656
  "daimuedu.com",
1631
1657
  "daintly.com",
@@ -1748,6 +1774,7 @@
1748
1774
  "dev-null.ml",
1749
1775
  "devbike.com",
1750
1776
  "developermail.com",
1777
+ "developtool.app",
1751
1778
  "devh24.online",
1752
1779
  "devnullmail.com",
1753
1780
  "devsonline.studio",
@@ -1755,6 +1782,7 @@
1755
1782
  "deyom.com",
1756
1783
  "dfghjertyh.dynv6.net",
1757
1784
  "dfyuih.eu.cc",
1785
+ "dgdf.cc",
1758
1786
  "dghdfjfd.eu.cc",
1759
1787
  "dh372.top",
1760
1788
  "dharmatel.net",
@@ -1854,7 +1882,9 @@
1854
1882
  "dnses.ro",
1855
1883
  "doanart.com",
1856
1884
  "dob.jp",
1885
+ "docash.app",
1857
1886
  "docbao7.com",
1887
+ "docse.site",
1858
1888
  "dodgeit.com",
1859
1889
  "dodgemail.de",
1860
1890
  "dodgit.com",
@@ -2114,6 +2144,7 @@
2114
2144
  "emailage.ml",
2115
2145
  "emailage.tk",
2116
2146
  "emailaoa.pro",
2147
+ "emailasia1.com",
2117
2148
  "emailate.com",
2118
2149
  "emailawb.pro",
2119
2150
  "emailax.pro",
@@ -2141,6 +2172,7 @@
2141
2172
  "emailinbo.live",
2142
2173
  "emailinfive.com",
2143
2174
  "emailisvalid.com",
2175
+ "emailjps.com",
2144
2176
  "emailkp.com",
2145
2177
  "emaillime.com",
2146
2178
  "emailluu.asia",
@@ -2178,6 +2210,7 @@
2178
2210
  "emailtik.com",
2179
2211
  "emailtmp.com",
2180
2212
  "emailto.de",
2213
+ "emailuae.com",
2181
2214
  "emailure.net",
2182
2215
  "emailvb.pro",
2183
2216
  "emailviet.com",
@@ -2448,6 +2481,7 @@
2448
2481
  "fexpost.com",
2449
2482
  "fextemp.com",
2450
2483
  "fft.edu.do",
2484
+ "fgmail.cyou",
2451
2485
  "fhoau.eu.cc",
2452
2486
  "fhpfhp.fr.nf",
2453
2487
  "fhwui.eu.cc",
@@ -2711,6 +2745,7 @@
2711
2745
  "gcmail.top",
2712
2746
  "gdcrm.store",
2713
2747
  "gddp2018.edu.vn",
2748
+ "gdfgergrer.online",
2714
2749
  "gdmail.top",
2715
2750
  "gdqoe.net",
2716
2751
  "gdxs.cc.cd",
@@ -2843,6 +2878,7 @@
2843
2878
  "gmailxsn.com",
2844
2879
  "gmailxsn.site",
2845
2880
  "gmailxsn.space",
2881
+ "gmailxyz.bond",
2846
2882
  "gmatch.org",
2847
2883
  "gmeenramy.com",
2848
2884
  "gmel.biz.id",
@@ -2866,6 +2902,7 @@
2866
2902
  "goemailgo.com",
2867
2903
  "goeschman.com",
2868
2904
  "gohivezone.com",
2905
+ "gokublue.me",
2869
2906
  "gold.edu.pl",
2870
2907
  "goldenmagpies.com",
2871
2908
  "goldinbox.net",
@@ -3206,6 +3243,7 @@
3206
3243
  "hihi.lol",
3207
3244
  "hikuhu.com",
3208
3245
  "hillaxiant.xyz",
3246
+ "hilmipremindo.com",
3209
3247
  "hilostar.com",
3210
3248
  "hiltonvr.com",
3211
3249
  "him6.com",
@@ -3224,6 +3262,7 @@
3224
3262
  "hoanggiaanh.com",
3225
3263
  "hoanglong.tech",
3226
3264
  "hochsitze.com",
3265
+ "hohohim.com",
3227
3266
  "hola.org",
3228
3267
  "holio.day",
3229
3268
  "holl.ga",
@@ -3349,6 +3388,7 @@
3349
3388
  "icidroit.info",
3350
3389
  "ickletonrelief.co.uk",
3351
3390
  "icloudmail.kr",
3391
+ "icloulb.com",
3352
3392
  "icmans.com",
3353
3393
  "iconmal.com",
3354
3394
  "icousd.com",
@@ -3444,6 +3484,7 @@
3444
3484
  "indomina.cf",
3445
3485
  "indoserver.stream",
3446
3486
  "indosukses.press",
3487
+ "indoxs.bond",
3447
3488
  "ineec.net",
3448
3489
  "inetopenwrt.dpdns.org",
3449
3490
  "infix1.io.vn",
@@ -3631,11 +3672,13 @@
3631
3672
  "jiaxi.work",
3632
3673
  "jibbo01.com",
3633
3674
  "jieluv.com",
3675
+ "jika.gg",
3634
3676
  "jilingling.eu.cc",
3635
3677
  "jincer.com",
3636
3678
  "jingood.dpdns.org",
3637
3679
  "jinkeyun.com",
3638
3680
  "jinva.fr.nf",
3681
+ "jiongguo.top",
3639
3682
  "jiooq.com",
3640
3683
  "jioso.com",
3641
3684
  "jiuji.asia",
@@ -3738,6 +3781,7 @@
3738
3781
  "katputli.world",
3739
3782
  "katztube.com",
3740
3783
  "kavio.my.id",
3784
+ "kawneha.site",
3741
3785
  "kaybooks.top",
3742
3786
  "kayfilms.top",
3743
3787
  "kaygroup.top",
@@ -3799,6 +3843,7 @@
3799
3843
  "kingsq.ga",
3800
3844
  "kingss.de5.net",
3801
3845
  "kino-100.ru",
3846
+ "kintil.buzz",
3802
3847
  "kiois.com",
3803
3848
  "kismail.ru",
3804
3849
  "kisoq.com",
@@ -3809,6 +3854,7 @@
3809
3854
  "kiwkiw.shop",
3810
3855
  "kjkszpjcompany.com",
3811
3856
  "kkdty.dynv6.net",
3857
+ "kkkoouy.cyou",
3812
3858
  "kkmail.be",
3813
3859
  "kkoup.com",
3814
3860
  "kksm.be",
@@ -3918,6 +3964,7 @@
3918
3964
  "lamasticots.com",
3919
3965
  "lambsauce.de",
3920
3966
  "landmail.co",
3967
+ "lanuiopl.bond",
3921
3968
  "laoeq.com",
3922
3969
  "laoia.com",
3923
3970
  "lapakqu.com",
@@ -4118,6 +4165,7 @@
4118
4165
  "luxovira.cfd",
4119
4166
  "luxudata.com",
4120
4167
  "lxbeta.com",
4168
+ "lxydawang.top",
4121
4169
  "lydir.com",
4122
4170
  "lyfestylecreditsolutions.com",
4123
4171
  "lyft.live",
@@ -4380,6 +4428,7 @@
4380
4428
  "mailvip.net",
4381
4429
  "mailw.site",
4382
4430
  "mailx.click",
4431
+ "mailxyz.cyou",
4383
4432
  "mailyan.my.id",
4384
4433
  "mailzi.ru",
4385
4434
  "mailzilla.com",
@@ -4390,6 +4439,7 @@
4390
4439
  "make.cc.cd",
4391
4440
  "makemenaughty.club",
4392
4441
  "makemetheking.com",
4442
+ "makeraura.online",
4393
4443
  "makertrial.com",
4394
4444
  "makoli.sbs",
4395
4445
  "malahov.de",
@@ -4492,6 +4542,7 @@
4492
4542
  "messwiththebestdielikethe.rest",
4493
4543
  "metadownload.org",
4494
4544
  "metaintern.net",
4545
+ "metajaya.biz.id",
4495
4546
  "metalunits.com",
4496
4547
  "metaorbitx.com",
4497
4548
  "mexvat.com",
@@ -4543,6 +4594,7 @@
4543
4594
  "minuteafter.com",
4544
4595
  "minuteinbox.com",
4545
4596
  "mirai.re",
4597
+ "mirasync.tokyo",
4546
4598
  "miros.cloud",
4547
4599
  "missionbulldogs.org",
4548
4600
  "misterpinball.de",
@@ -4574,6 +4626,7 @@
4574
4626
  "mmmggg0123.ccwu.cc",
4575
4627
  "mmmo.us.ci",
4576
4628
  "mmo.us.ci",
4629
+ "mmo365.store",
4577
4630
  "mmyuu.cn",
4578
4631
  "mnode.me",
4579
4632
  "mnvr.site",
@@ -4615,6 +4668,7 @@
4615
4668
  "monomoho.site",
4616
4669
  "monopacket.com",
4617
4670
  "monumentmail.com",
4671
+ "monyal.shop",
4618
4672
  "moolee.net",
4619
4673
  "moonapps.org",
4620
4674
  "moondyal.com",
@@ -4770,6 +4824,7 @@
4770
4824
  "mtshop18.io.vn",
4771
4825
  "muadaingan.com",
4772
4826
  "muareview.com",
4827
+ "muataikhoan.info",
4773
4828
  "muathegame.com",
4774
4829
  "muchomail.com",
4775
4830
  "mucincanon.com",
@@ -4794,6 +4849,7 @@
4794
4849
  "muratec.eu.org",
4795
4850
  "muratreis.icu",
4796
4851
  "musiccode.me",
4852
+ "musicflow.buzz",
4797
4853
  "musiku.studio",
4798
4854
  "mutant.me",
4799
4855
  "mutudev.com",
@@ -4944,6 +5000,7 @@
4944
5000
  "netris.net",
4945
5001
  "netviewer-france.com",
4946
5002
  "netzidiot.de",
5003
+ "nevanata.com",
4947
5004
  "nevermail.de",
4948
5005
  "neverover.life",
4949
5006
  "new-api.cc.cd",
@@ -4958,6 +5015,7 @@
4958
5015
  "newmano.store",
4959
5016
  "newsteadabbeypartnership.org",
4960
5017
  "newyork.io.vn",
5018
+ "nexarshop.store",
4961
5019
  "nexentia.cfd",
4962
5020
  "nexio.sbs",
4963
5021
  "nexorabio.pro.vn",
@@ -5048,6 +5106,7 @@
5048
5106
  "nomorix.cfd",
5049
5107
  "nonchalantresmita.biz",
5050
5108
  "nondon.site",
5109
+ "nondon.store",
5051
5110
  "nongnue.com",
5052
5111
  "nonspam.eu",
5053
5112
  "nonspammer.de",
@@ -5161,6 +5220,7 @@
5161
5220
  "oing.cf",
5162
5221
  "okcdeals.com",
5163
5222
  "okclprojects.com",
5223
+ "okcx.edu.rs",
5164
5224
  "okcxhssgk.top",
5165
5225
  "okhko.com",
5166
5226
  "okiae.com",
@@ -5238,6 +5298,7 @@
5238
5298
  "openmail.pro",
5239
5299
  "opentrash.com",
5240
5300
  "openwrt.qzz.io",
5301
+ "opihhushdjn.cyou",
5241
5302
  "opmmedia.ga",
5242
5303
  "oposite.org",
5243
5304
  "opp24.com",
@@ -5283,6 +5344,7 @@
5283
5344
  "outlawspam.com",
5284
5345
  "outlook.edu.pl",
5285
5346
  "outlookapp.tech",
5347
+ "outlooks.bond",
5286
5348
  "outmail.win",
5287
5349
  "ovbest.com",
5288
5350
  "ovomail.co",
@@ -5485,6 +5547,7 @@
5485
5547
  "poubelle-du.net",
5486
5548
  "poubelle.fr.nf",
5487
5549
  "poutineyourface.com",
5550
+ "powerdea.me",
5488
5551
  "powered.name",
5489
5552
  "powerencry.com",
5490
5553
  "powerscrews.com",
@@ -5492,6 +5555,7 @@
5492
5555
  "pox2.com",
5493
5556
  "pozima.rest",
5494
5557
  "pp-n6.top",
5558
+ "pp-tw.cc",
5495
5559
  "pp7rvv.com",
5496
5560
  "ppdf.cc",
5497
5561
  "ppedu.pp.ua",
@@ -5533,6 +5597,7 @@
5533
5597
  "privacyshield.cc",
5534
5598
  "privatdemail.net",
5535
5599
  "privmail.edu.pl",
5600
+ "privo.edu.pl",
5536
5601
  "privy-mail.com",
5537
5602
  "privy-mail.de",
5538
5603
  "privymail.de",
@@ -5715,6 +5780,7 @@
5715
5780
  "realquickemail.com",
5716
5781
  "realseek.xyz",
5717
5782
  "realtyalerts.ca",
5783
+ "reapsa.com",
5718
5784
  "rebates.stream",
5719
5785
  "receiveee.com",
5720
5786
  "recipeforfailure.com",
@@ -5836,11 +5902,13 @@
5836
5902
  "rtrobinsbequest.org.uk",
5837
5903
  "rtrtr.com",
5838
5904
  "rtskiya.xyz",
5905
+ "rua.pp.ua",
5839
5906
  "rudymail.ml",
5840
5907
  "ruinique.tech",
5841
5908
  "rukiaops.me",
5842
5909
  "rulersonline.com",
5843
5910
  "rumgel.com",
5911
+ "runcubesapps.id",
5844
5912
  "runi.ca",
5845
5913
  "rupayamail.com",
5846
5914
  "ruru.be",
@@ -5856,6 +5924,7 @@
5856
5924
  "rxs9.cn",
5857
5925
  "rygel.infos.st",
5858
5926
  "ryteto.me",
5927
+ "ryuu.codes",
5859
5928
  "ryyr.ru",
5860
5929
  "ryyr.store",
5861
5930
  "s-mail.social",
@@ -5907,6 +5976,7 @@
5907
5976
  "sast.ro",
5908
5977
  "sasukiez.shop",
5909
5978
  "satisfyme.club",
5979
+ "satorix.id",
5910
5980
  "satukosong.com",
5911
5981
  "saturrshop.uk",
5912
5982
  "saungadaid.pro",
@@ -5946,6 +6016,7 @@
5946
6016
  "secure-mail.cc",
5947
6017
  "secured-link.net",
5948
6018
  "securehost.com.es",
6019
+ "sedekah-mudah.com",
5949
6020
  "seduck.com",
5950
6021
  "seedcorn.foundation",
5951
6022
  "seedspeed.site",
@@ -5970,9 +6041,11 @@
5970
6041
  "sendnow.win",
5971
6042
  "sendo.dedyn.io",
5972
6043
  "sendo.giize.com",
6044
+ "sendokai.click",
5973
6045
  "sendos.fr.nf",
5974
6046
  "sendos.infos.st",
5975
6047
  "sendspamhere.com",
6048
+ "sengkuni.dedyn.io",
5976
6049
  "sengkuni.qzz.io",
5977
6050
  "sengkuni.xx.kg",
5978
6051
  "senseless-entertainment.com",
@@ -6013,6 +6086,7 @@
6013
6086
  "shchiba.uk",
6014
6087
  "sheerid.top",
6015
6088
  "sheinup.com",
6089
+ "shengxia.asia",
6016
6090
  "sherazhaider.com",
6017
6091
  "sheryli.com",
6018
6092
  "shhmail.com",
@@ -6345,6 +6419,7 @@
6345
6419
  "starcheck.in",
6346
6420
  "stardust-2.store",
6347
6421
  "starlight-breaker.net",
6422
+ "starlight.store",
6348
6423
  "starmail.net",
6349
6424
  "starnlink.com",
6350
6425
  "starpower.space",
@@ -6359,6 +6434,7 @@
6359
6434
  "steambot.net",
6360
6435
  "steel4work.io.vn",
6361
6436
  "stepsofhope.co.uk",
6437
+ "sterlingpointco.com",
6362
6438
  "stexsy.com",
6363
6439
  "stinkefinger.net",
6364
6440
  "stomatogomail.ru",
@@ -6472,6 +6548,7 @@
6472
6548
  "tagyourself.com",
6473
6549
  "taikhoankiro.pro",
6474
6550
  "taimb.com",
6551
+ "taischaves.com",
6475
6552
  "tako.skin",
6476
6553
  "talemarketing.com",
6477
6554
  "talkinator.com",
@@ -6660,6 +6737,7 @@
6660
6737
  "theaviors.com",
6661
6738
  "thebearshark.com",
6662
6739
  "thebest73.shop",
6740
+ "theboys.cyou",
6663
6741
  "thecarinformation.com",
6664
6742
  "thechildrensfocus.com",
6665
6743
  "thecity.biz",
@@ -6701,6 +6779,7 @@
6701
6779
  "thirifara.com",
6702
6780
  "thisisnotmyrealemail.com",
6703
6781
  "thismail.net",
6782
+ "thispy.top",
6704
6783
  "thisurl.website",
6705
6784
  "thnikka.com",
6706
6785
  "thoas.ru",
@@ -6722,6 +6801,7 @@
6722
6801
  "thulinh.net",
6723
6802
  "thunderbolt.science",
6724
6803
  "thunkinator.org",
6804
+ "thuongxg.com",
6725
6805
  "thurleighchurchestate.church",
6726
6806
  "thxmate.com",
6727
6807
  "tianblog.top",
@@ -6862,6 +6942,7 @@
6862
6942
  "tradermail.info",
6863
6943
  "tradingview.my.id",
6864
6944
  "trainthem2fish.co.uk",
6945
+ "tramynguyen.net",
6865
6946
  "tranceversal.com",
6866
6947
  "trandigabapoe.shop",
6867
6948
  "trangiabao.click",
@@ -6908,6 +6989,7 @@
6908
6989
  "trashymail.net",
6909
6990
  "trasz.com",
6910
6991
  "travelistaworld.com",
6992
+ "travelovelinka.club",
6911
6993
  "travionex.cfd",
6912
6994
  "trayna.com",
6913
6995
  "trbvm.com",
@@ -6916,6 +6998,7 @@
6916
6998
  "treesforderby.org",
6917
6999
  "trend-maker.ru",
6918
7000
  "treso.me",
7001
+ "treterter.shop",
6919
7002
  "trevourus.com",
6920
7003
  "trfu.to",
6921
7004
  "trgfu.com",
@@ -6955,6 +7038,7 @@
6955
7038
  "tualias.com",
6956
7039
  "tuamaeaquelaursa.com",
6957
7040
  "tubeemail.com",
7041
+ "tuku26012023.xyz",
6958
7042
  "tumroc.net",
6959
7043
  "tunthuta.com",
6960
7044
  "tuofs.com",
@@ -7054,6 +7138,7 @@
7054
7138
  "urgentmail.ovh",
7055
7139
  "urhen.com",
7056
7140
  "uroid.com",
7141
+ "us-x.top",
7057
7142
  "us.af",
7058
7143
  "us.to",
7059
7144
  "usa.cc",
@@ -7078,6 +7163,7 @@
7078
7163
  "usus.ddnsfree.com",
7079
7164
  "ususus.dynv6.net",
7080
7165
  "utiket.us",
7166
+ "utkarsh.tech",
7081
7167
  "uu.gl",
7082
7168
  "uu2.ovh",
7083
7169
  "uue.edu.pl",
@@ -7329,6 +7415,7 @@
7329
7415
  "waterpalace.pro",
7330
7416
  "watersoftenersystemcost.com",
7331
7417
  "watrf.com",
7418
+ "watsawang.com",
7332
7419
  "waventra.cfd",
7333
7420
  "waw.indevs.in",
7334
7421
  "wazabi.club",
@@ -7438,6 +7525,7 @@
7438
7525
  "winemaven.info",
7439
7526
  "winocs.com",
7440
7527
  "wins.com.br",
7528
+ "wintersgf.store",
7441
7529
  "wintersmail.site",
7442
7530
  "wir-sind.com",
7443
7531
  "wireconnected.com",
@@ -7489,6 +7577,7 @@
7489
7577
  "wwefd.top",
7490
7578
  "wwej.cc.cd",
7491
7579
  "wwjmp.com",
7580
+ "wwtykkm.bond",
7492
7581
  "wwvec.uno",
7493
7582
  "wwvk.ru",
7494
7583
  "wwvk.store",
@@ -7513,6 +7602,7 @@
7513
7602
  "xagloo.com",
7514
7603
  "xandoria.cfd",
7515
7604
  "xapimail.top",
7605
+ "xazymarcie.space",
7516
7606
  "xbaby69.top",
7517
7607
  "xbrok.com",
7518
7608
  "xcf.pet",
@@ -7540,6 +7630,8 @@
7540
7630
  "xents.com",
7541
7631
  "xepa.ru",
7542
7632
  "xfavaj.com",
7633
+ "xgmail.bond",
7634
+ "xhotmail.cyou",
7543
7635
  "xi2.cc",
7544
7636
  "xiajspof.eu.cc",
7545
7637
  "xiangshan.eu.cc",
@@ -7563,6 +7655,7 @@
7563
7655
  "xmaily.com",
7564
7656
  "xmlab.icu",
7565
7657
  "xmyvgkvw.top",
7658
+ "xn--5nx.cc",
7566
7659
  "xn--9kq967o.com",
7567
7660
  "xn--d-bga.net",
7568
7661
  "xn--ihq4pool8g32cwxiiqcovaa9159jhvah03g.top",
@@ -7608,10 +7701,12 @@
7608
7701
  "yabes.ovh",
7609
7702
  "yahmail.top",
7610
7703
  "yahooproduct.net",
7704
+ "yahoox.cyou",
7611
7705
  "yaloo.fr.nf",
7612
7706
  "yamail.win",
7613
7707
  "yanet.me",
7614
7708
  "yangzhai.xyz",
7709
+ "yangzhong-sfd.cc",
7615
7710
  "yannmail.win",
7616
7711
  "yanxuan.eu.cc",
7617
7712
  "yapped.net",
@@ -7785,6 +7880,7 @@
7785
7880
  "zhorachu.com",
7786
7881
  "zhousj.eu.org",
7787
7882
  "zik.dj",
7883
+ "zikzak.site",
7788
7884
  "zipcad.com",
7789
7885
  "zipcatfish.com",
7790
7886
  "ziping.me",
@@ -198,5 +198,29 @@ module.exports = {
198
198
  assert.equal(String(second.content).startsWith('Echo:'), true, 'echo fallback');
199
199
  },
200
200
  },
201
+
202
+ // ─── Path-based messages (BEM prompt-template style) ───
203
+
204
+ {
205
+ name: 'reply-directive-from-path-based-message-settings',
206
+ async run({ assert }) {
207
+ // Routes idiomatically pass message: { path, settings } — the real
208
+ // providers render the template, so directives arrive via settings values
209
+ const provider = makeProvider();
210
+ const result = await provider.request({
211
+ response: 'json',
212
+ message: {
213
+ path: '/prompts/user.md',
214
+ settings: {
215
+ level: 'college',
216
+ message: 'What is 2+2? [[reply:{"answer":"4"}]]',
217
+ },
218
+ },
219
+ });
220
+
221
+ assert.equal(typeof result.content, 'object', 'parsed object');
222
+ assert.equal(result.content.answer, '4', 'directive extracted from settings values');
223
+ },
224
+ },
201
225
  ],
202
226
  };
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Test: Usage limit semantics (helpers/usage.js)
3
+ *
4
+ * Negative product limits (the -1 "unlimited" config convention) must never
5
+ * rate-limit a user. Regression: the daily-cap math turned -1 into a 0/day cap
6
+ * that 429'd every request from unlimited-plan users.
7
+ */
8
+ const PRODUCT_ID = 'unlimited-limits-fixture';
9
+ const TEST_UID = '_test-unlimited-limits-user';
10
+
11
+ module.exports = {
12
+ description: 'Usage limits (negative = unlimited)',
13
+ type: 'suite',
14
+ timeout: 15000,
15
+
16
+ tests: [
17
+ {
18
+ name: 'setup-product-and-user',
19
+ async run({ Manager, firestore, state, assert }) {
20
+ // Inject a fixture product into the real config (restored in cleanup)
21
+ Manager.config.payment = Manager.config.payment || {};
22
+ state.originalProducts = Manager.config.payment.products;
23
+ Manager.config.payment.products = [
24
+ ...(state.originalProducts || []),
25
+ { id: PRODUCT_ID, type: 'subscription', limits: { requests: -1 } },
26
+ ];
27
+
28
+ // Seed a user on that product with existing usage (fixture seeding —
29
+ // production code must always go through the usage helper)
30
+ await firestore.set(`users/${TEST_UID}`, {
31
+ subscription: { product: { id: PRODUCT_ID }, status: 'active' },
32
+ usage: { requests: { monthly: 12345, daily: 678, total: 99999 } },
33
+ });
34
+
35
+ assert.ok(true, 'Fixture product and user seeded');
36
+ },
37
+ },
38
+ {
39
+ name: 'negative-limit-has-no-daily-allowance',
40
+ async run({ Manager, state, assert }) {
41
+ const usage = Manager.Usage();
42
+ await usage.init(Manager.Assistant(), { log: false });
43
+ await usage.setUser(TEST_UID);
44
+
45
+ state.usage = usage;
46
+
47
+ assert.equal(usage.getLimit('requests'), -1, 'Limit resolves to -1');
48
+ assert.equal(usage.getDailyAllowance('requests'), null, 'Negative limits have no daily cap');
49
+ },
50
+ },
51
+ {
52
+ name: 'validate-resolves-for-negative-limit',
53
+ async run({ state, assert }) {
54
+ const result = await state.usage.validate('requests').catch((e) => e);
55
+
56
+ assert.ok(!(result instanceof Error), 'validate() must resolve for unlimited plans regardless of usage');
57
+ },
58
+ },
59
+ {
60
+ name: 'zero-limit-still-rejects',
61
+ async run({ Manager, firestore, assert }) {
62
+ // Guard the other edge: a missing/0 limit must keep rejecting
63
+ await firestore.set(`users/${TEST_UID}-zero`, {
64
+ subscription: { product: { id: 'basic' }, status: 'active' },
65
+ usage: { unknownmetric: { monthly: 1, daily: 1, total: 1 } },
66
+ });
67
+
68
+ const usage = Manager.Usage();
69
+ await usage.init(Manager.Assistant(), { log: false });
70
+ await usage.setUser(`${TEST_UID}-zero`);
71
+
72
+ const result = await usage.validate('unknownmetric').catch((e) => e);
73
+
74
+ assert.ok(result instanceof Error, 'Metrics without a configured limit must reject');
75
+ },
76
+ },
77
+ ],
78
+
79
+ async cleanup({ Manager, state }) {
80
+ // Restore the real product list
81
+ if (Manager?.config?.payment) {
82
+ Manager.config.payment.products = state?.originalProducts;
83
+ }
84
+ },
85
+ };