@oobe-protocol-labs/sap-mcp-server 0.8.0 → 0.9.1

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 (133) hide show
  1. package/.env.example +30 -0
  2. package/CHANGELOG.md +59 -1
  3. package/README.md +19 -2
  4. package/USER_DOCS/00_START_HERE.md +1 -0
  5. package/USER_DOCS/01_HOSTED_REMOTE_MCP.md +17 -3
  6. package/USER_DOCS/03_PAYMENTS_X402_PAYSH.md +11 -1
  7. package/USER_DOCS/04_CLIENT_CONFIGS.md +4 -3
  8. package/USER_DOCS/05_SKILLS_AND_TOOLS.md +27 -3
  9. package/USER_DOCS/06_DESKTOP_GUI_WIZARD.md +14 -7
  10. package/USER_DOCS/07_SMITHERY_AND_MARKETPLACES.md +163 -0
  11. package/assets/logos/claude.png +0 -0
  12. package/assets/logos/codex.webp +0 -0
  13. package/assets/logos/hermes.png +0 -0
  14. package/assets/logos/openclaw.svg +22 -0
  15. package/config.schema.json +5 -0
  16. package/dist/config/env.d.ts +4 -0
  17. package/dist/config/env.d.ts.map +1 -1
  18. package/dist/config/env.js +3 -0
  19. package/dist/config/env.js.map +1 -1
  20. package/dist/config/mcp-client-injection.js +2 -2
  21. package/dist/config/mcp-client-injection.js.map +1 -1
  22. package/dist/config/paths.d.ts +6 -0
  23. package/dist/config/paths.d.ts.map +1 -1
  24. package/dist/config/paths.js +14 -0
  25. package/dist/config/paths.js.map +1 -1
  26. package/dist/config/wizard.js +3 -3
  27. package/dist/config/wizard.js.map +1 -1
  28. package/dist/core/constants.d.ts +1 -1
  29. package/dist/core/constants.js +1 -1
  30. package/dist/payments/pricing.d.ts +1 -1
  31. package/dist/payments/pricing.d.ts.map +1 -1
  32. package/dist/payments/pricing.js +21 -3
  33. package/dist/payments/pricing.js.map +1 -1
  34. package/dist/payments/x402-paid-call.d.ts +96 -0
  35. package/dist/payments/x402-paid-call.d.ts.map +1 -1
  36. package/dist/payments/x402-paid-call.js +264 -2
  37. package/dist/payments/x402-paid-call.js.map +1 -1
  38. package/dist/policy/local-policy-engine.js +1 -1
  39. package/dist/policy/local-policy-engine.js.map +1 -1
  40. package/dist/prompts/context/sap-agent-context.prompt.js +8 -1
  41. package/dist/prompts/context/sap-agent-context.prompt.js.map +1 -1
  42. package/dist/prompts/context/sap-agent-start.prompt.d.ts +14 -0
  43. package/dist/prompts/context/sap-agent-start.prompt.d.ts.map +1 -0
  44. package/dist/prompts/context/sap-agent-start.prompt.js +96 -0
  45. package/dist/prompts/context/sap-agent-start.prompt.js.map +1 -0
  46. package/dist/prompts/developer/generate-sap-integration.prompt.js +1 -1
  47. package/dist/prompts/developer/generate-sap-integration.prompt.js.map +1 -1
  48. package/dist/prompts/register-prompts.d.ts.map +1 -1
  49. package/dist/prompts/register-prompts.js +3 -1
  50. package/dist/prompts/register-prompts.js.map +1 -1
  51. package/dist/remote/public-home/index.d.ts.map +1 -1
  52. package/dist/remote/public-home/index.js +2 -1
  53. package/dist/remote/public-home/index.js.map +1 -1
  54. package/dist/remote/public-home/scripts.d.ts +1 -1
  55. package/dist/remote/public-home/scripts.d.ts.map +1 -1
  56. package/dist/remote/public-home/scripts.js +29 -0
  57. package/dist/remote/public-home/scripts.js.map +1 -1
  58. package/dist/remote/public-home/sections.d.ts +5 -0
  59. package/dist/remote/public-home/sections.d.ts.map +1 -1
  60. package/dist/remote/public-home/sections.js +76 -4
  61. package/dist/remote/public-home/sections.js.map +1 -1
  62. package/dist/remote/public-home/styles.d.ts +1 -1
  63. package/dist/remote/public-home/styles.d.ts.map +1 -1
  64. package/dist/remote/public-home/styles.js +460 -16
  65. package/dist/remote/public-home/styles.js.map +1 -1
  66. package/dist/remote/public-home/types.d.ts +2 -0
  67. package/dist/remote/public-home/types.d.ts.map +1 -1
  68. package/dist/remote/rate-limiter.d.ts +2 -0
  69. package/dist/remote/rate-limiter.d.ts.map +1 -1
  70. package/dist/remote/rate-limiter.js +23 -0
  71. package/dist/remote/rate-limiter.js.map +1 -1
  72. package/dist/remote/server.d.ts +72 -1
  73. package/dist/remote/server.d.ts.map +1 -1
  74. package/dist/remote/server.js +424 -15
  75. package/dist/remote/server.js.map +1 -1
  76. package/dist/runtime/module-resolution.d.ts.map +1 -1
  77. package/dist/runtime/module-resolution.js +41 -8
  78. package/dist/runtime/module-resolution.js.map +1 -1
  79. package/dist/schemas/settlement.schema.d.ts +2 -2
  80. package/dist/security/tool-permissions.d.ts.map +1 -1
  81. package/dist/security/tool-permissions.js +1 -6
  82. package/dist/security/tool-permissions.js.map +1 -1
  83. package/dist/tools/agent-start-tool.d.ts +12 -0
  84. package/dist/tools/agent-start-tool.d.ts.map +1 -0
  85. package/dist/tools/agent-start-tool.js +156 -0
  86. package/dist/tools/agent-start-tool.js.map +1 -0
  87. package/dist/tools/client-sdk-tools.d.ts +7 -0
  88. package/dist/tools/client-sdk-tools.d.ts.map +1 -1
  89. package/dist/tools/client-sdk-tools.js +80 -4
  90. package/dist/tools/client-sdk-tools.js.map +1 -1
  91. package/dist/tools/index.d.ts +1 -0
  92. package/dist/tools/index.d.ts.map +1 -1
  93. package/dist/tools/index.js +3 -1
  94. package/dist/tools/index.js.map +1 -1
  95. package/dist/tools/register-tools.d.ts.map +1 -1
  96. package/dist/tools/register-tools.js +5 -1
  97. package/dist/tools/register-tools.js.map +1 -1
  98. package/dist/tools/sap-sdk-tools.d.ts +1 -1
  99. package/dist/tools/sap-sdk-tools.d.ts.map +1 -1
  100. package/dist/tools/sap-sdk-tools.js +108 -105
  101. package/dist/tools/sap-sdk-tools.js.map +1 -1
  102. package/dist/tools/sap-sns-tools.d.ts +4 -4
  103. package/dist/tools/sap-sns-tools.js +4 -4
  104. package/dist/tools/skills-tools.js +1 -1
  105. package/dist/tools/skills-tools.js.map +1 -1
  106. package/dist/tools/x402-paid-call-tool.d.ts.map +1 -1
  107. package/dist/tools/x402-paid-call-tool.js +50 -4
  108. package/dist/tools/x402-paid-call-tool.js.map +1 -1
  109. package/dist/tui/config-wizard.js +2 -2
  110. package/dist/tui/config-wizard.js.map +1 -1
  111. package/dist/tui/wizard-save.d.ts.map +1 -1
  112. package/dist/tui/wizard-save.js +7 -3
  113. package/dist/tui/wizard-save.js.map +1 -1
  114. package/dist/wizard-core/desktop-flow.d.ts +1 -1
  115. package/dist/wizard-core/desktop-flow.d.ts.map +1 -1
  116. package/dist/wizard-core/desktop-flow.js +6 -5
  117. package/dist/wizard-core/desktop-flow.js.map +1 -1
  118. package/docs/03_CONFIGURATION_AND_WIZARD.md +1 -0
  119. package/docs/05_REMOTE_VPS_DEPLOYMENT.md +32 -0
  120. package/docs/06_PAYMENTS_X402_AND_PAYSH.md +12 -0
  121. package/docs/07_ENDPOINTS_AND_CLIENTS.md +1 -1
  122. package/docs/09_TOOLS_SKILLS_AND_AGENT_GUIDE.md +42 -11
  123. package/docs/14_DESKTOP_WIZARD_RELEASE.md +2 -1
  124. package/docs/README.md +6 -3
  125. package/docs/_sidebar.md +1 -0
  126. package/package.json +3 -2
  127. package/server.json +3 -3
  128. package/skills/README.md +2 -2
  129. package/skills/sap-escrow-settlement/SKILL.md +15 -11
  130. package/skills/sap-mcp/SKILL.md +39 -20
  131. package/skills/sap-mcp/TOOL_REFERENCE.md +6 -5
  132. package/skills/sap-operations/SKILL.md +6 -7
  133. package/smithery.config.schema.json +59 -0
@@ -28,6 +28,9 @@ export const LANDING_CSS = `
28
28
  }
29
29
 
30
30
  * { box-sizing: border-box; }
31
+ img, svg, video, canvas {
32
+ max-width: 100%;
33
+ }
31
34
  html { scroll-behavior: smooth; }
32
35
  body {
33
36
  margin: 0;
@@ -54,6 +57,9 @@ export const LANDING_CSS = `
54
57
  }
55
58
 
56
59
  a { color: inherit; }
60
+ code, pre {
61
+ max-width: 100%;
62
+ }
57
63
  a:focus-visible, button:focus-visible {
58
64
  outline: 2px solid var(--aqua);
59
65
  outline-offset: 3px;
@@ -91,6 +97,11 @@ export const LANDING_CSS = `
91
97
  box-shadow: 0 18px 44px rgba(0, 0, 0, .28);
92
98
  backdrop-filter: blur(18px);
93
99
  }
100
+ .mobile-nav-toggle,
101
+ .mobile-nav-backdrop,
102
+ .mobile-nav-panel {
103
+ display: none;
104
+ }
94
105
  .brand {
95
106
  display: inline-flex;
96
107
  align-items: center;
@@ -98,6 +109,18 @@ export const LANDING_CSS = `
98
109
  min-width: 0;
99
110
  text-decoration: none;
100
111
  }
112
+ .brand > span,
113
+ .nav-menu-link span,
114
+ .download-action span,
115
+ .download-card span,
116
+ .card,
117
+ .metric,
118
+ .feature,
119
+ .bento-card,
120
+ .protocol-card,
121
+ .registry-card {
122
+ min-width: 0;
123
+ }
101
124
  .brand img {
102
125
  width: 42px;
103
126
  height: 42px;
@@ -259,6 +282,7 @@ export const LANDING_CSS = `
259
282
  display: flex;
260
283
  gap: 8px;
261
284
  align-items: center;
285
+ min-width: 0;
262
286
  }
263
287
  .nav-install {
264
288
  gap: 8px;
@@ -285,6 +309,145 @@ export const LANDING_CSS = `
285
309
  color: #061517;
286
310
  background: var(--aqua);
287
311
  }
312
+ .mobile-nav-toggle,
313
+ .mobile-nav-close {
314
+ appearance: none;
315
+ border: 1px solid rgba(255, 255, 255, .12);
316
+ color: var(--ink);
317
+ background: rgba(255, 255, 255, .045);
318
+ }
319
+ .mobile-nav-toggle {
320
+ width: 44px;
321
+ height: 44px;
322
+ border-radius: 15px;
323
+ place-items: center;
324
+ gap: 2px;
325
+ padding: 0;
326
+ }
327
+ .mobile-nav-toggle span {
328
+ display: block;
329
+ width: 18px;
330
+ height: 2px;
331
+ border-radius: 99px;
332
+ background: var(--ink);
333
+ transition: transform .18s ease, opacity .18s ease;
334
+ }
335
+ .mobile-nav-close {
336
+ display: grid;
337
+ place-items: center;
338
+ width: 42px;
339
+ height: 42px;
340
+ border-radius: 14px;
341
+ font-size: 28px;
342
+ line-height: 1;
343
+ }
344
+ .mobile-nav-backdrop {
345
+ position: fixed;
346
+ inset: 0;
347
+ z-index: 60;
348
+ background: rgba(0, 0, 0, .48);
349
+ backdrop-filter: blur(5px);
350
+ -webkit-backdrop-filter: blur(5px);
351
+ opacity: 0;
352
+ pointer-events: none;
353
+ transition: opacity .18s ease;
354
+ }
355
+ .mobile-nav-panel {
356
+ position: fixed;
357
+ inset: 10px 10px 10px auto;
358
+ z-index: 70;
359
+ width: min(390px, calc(100vw - 20px));
360
+ border: 1px solid rgba(255, 255, 255, .12);
361
+ border-radius: 26px;
362
+ padding: 14px;
363
+ overflow: auto;
364
+ background:
365
+ linear-gradient(180deg, rgba(255,255,255,.075), rgba(255,255,255,.035)),
366
+ rgba(8, 16, 17, .94);
367
+ box-shadow: 0 28px 80px rgba(0, 0, 0, .5);
368
+ backdrop-filter: blur(24px);
369
+ -webkit-backdrop-filter: blur(24px);
370
+ transform: translateX(calc(100% + 20px));
371
+ transition: transform .2s cubic-bezier(.2, .8, .2, 1);
372
+ }
373
+ .mobile-nav-head {
374
+ display: flex;
375
+ align-items: center;
376
+ justify-content: space-between;
377
+ gap: 12px;
378
+ padding-bottom: 14px;
379
+ border-bottom: 1px solid rgba(255, 255, 255, .1);
380
+ }
381
+ .mobile-nav-primary {
382
+ display: grid;
383
+ grid-template-columns: 1fr 1fr;
384
+ gap: 9px;
385
+ margin: 14px 0;
386
+ }
387
+ .mobile-nav-primary .primary {
388
+ grid-column: 1 / -1;
389
+ }
390
+ .mobile-nav-group {
391
+ display: grid;
392
+ gap: 8px;
393
+ margin-top: 16px;
394
+ }
395
+ .mobile-nav-group p {
396
+ margin: 0;
397
+ color: var(--aqua);
398
+ font-size: 12px;
399
+ font-weight: 900;
400
+ text-transform: uppercase;
401
+ }
402
+ .mobile-nav-link {
403
+ display: grid;
404
+ grid-template-columns: 1fr auto;
405
+ gap: 12px;
406
+ align-items: center;
407
+ min-width: 0;
408
+ border: 1px solid rgba(255, 255, 255, .09);
409
+ border-radius: 16px;
410
+ padding: 12px;
411
+ color: var(--ink);
412
+ text-decoration: none;
413
+ background: rgba(255, 255, 255, .04);
414
+ }
415
+ .mobile-nav-link:hover {
416
+ border-color: rgba(40, 216, 232, .34);
417
+ background: rgba(40, 216, 232, .075);
418
+ }
419
+ .mobile-nav-link strong,
420
+ .mobile-nav-link small {
421
+ display: block;
422
+ }
423
+ .mobile-nav-link small {
424
+ margin-top: 4px;
425
+ color: var(--subtle);
426
+ font-size: 12px;
427
+ line-height: 1.35;
428
+ }
429
+ .mobile-nav-link b {
430
+ color: var(--aqua);
431
+ }
432
+ html.mobile-nav-open {
433
+ overflow: hidden;
434
+ }
435
+ html.mobile-nav-open .mobile-nav-backdrop {
436
+ opacity: 1;
437
+ pointer-events: auto;
438
+ }
439
+ html.mobile-nav-open .mobile-nav-panel {
440
+ transform: translateX(0);
441
+ }
442
+ html.mobile-nav-open .mobile-nav-toggle span:nth-child(1) {
443
+ transform: translateY(4px) rotate(45deg);
444
+ }
445
+ html.mobile-nav-open .mobile-nav-toggle span:nth-child(2) {
446
+ opacity: 0;
447
+ }
448
+ html.mobile-nav-open .mobile-nav-toggle span:nth-child(3) {
449
+ transform: translateY(-4px) rotate(-45deg);
450
+ }
288
451
  .version-pill {
289
452
  border: 1px solid rgba(255, 255, 255, .12);
290
453
  border-radius: 999px;
@@ -295,6 +458,54 @@ export const LANDING_CSS = `
295
458
  white-space: nowrap;
296
459
  }
297
460
 
461
+ .runtime-logo-strip {
462
+ width: min(calc(100% - 32px), var(--content));
463
+ margin: 12px auto 0;
464
+ overflow: hidden;
465
+ }
466
+ .runtime-logo-rail {
467
+ position: relative;
468
+ overflow: hidden;
469
+ border: 1px solid rgba(255, 255, 255, .1);
470
+ border-radius: 999px;
471
+ padding: 8px;
472
+ background: rgba(255, 255, 255, .035);
473
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.06);
474
+ mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
475
+ }
476
+ .runtime-logo-rail div {
477
+ display: flex;
478
+ width: max-content;
479
+ gap: 8px;
480
+ animation: runtimeRail 34s linear infinite;
481
+ }
482
+ .runtime-logo-item {
483
+ display: inline-flex;
484
+ align-items: center;
485
+ gap: 10px;
486
+ min-height: 44px;
487
+ border: 1px solid rgba(40, 216, 232, .16);
488
+ border-radius: 999px;
489
+ padding: 7px 16px 7px 8px;
490
+ color: var(--ink);
491
+ background: rgba(8, 18, 19, .72);
492
+ white-space: nowrap;
493
+ }
494
+ .runtime-logo-item img {
495
+ flex: 0 0 auto;
496
+ width: 30px;
497
+ height: 30px;
498
+ border: 1px solid rgba(40, 216, 232, .24);
499
+ border-radius: 999px;
500
+ background: rgba(40, 216, 232, .08);
501
+ object-fit: contain;
502
+ padding: 2px;
503
+ }
504
+ .runtime-logo-item strong {
505
+ font-size: 13px;
506
+ line-height: 1;
507
+ }
508
+
298
509
  .page-shell {
299
510
  width: min(calc(100% - 32px), var(--content));
300
511
  margin: 0 auto;
@@ -308,6 +519,9 @@ export const LANDING_CSS = `
308
519
  align-items: center;
309
520
  padding: 78px 0 52px;
310
521
  }
522
+ .hero > * {
523
+ min-width: 0;
524
+ }
311
525
  .hero-copy { align-self: center; }
312
526
  .eyebrow {
313
527
  margin: 0 0 18px;
@@ -490,6 +704,9 @@ export const LANDING_CSS = `
490
704
  gap: 58px;
491
705
  align-items: start;
492
706
  }
707
+ .bento-stack > * {
708
+ min-width: 0;
709
+ }
493
710
  .bento-sticky-copy {
494
711
  position: sticky;
495
712
  top: 112px;
@@ -886,6 +1103,10 @@ export const LANDING_CSS = `
886
1103
  from { transform: translateX(0); }
887
1104
  to { transform: translateX(-50%); }
888
1105
  }
1106
+ @keyframes runtimeRail {
1107
+ from { transform: translateX(0); }
1108
+ to { transform: translateX(-33.333%); }
1109
+ }
889
1110
 
890
1111
  .registry-section {
891
1112
  padding-top: 94px;
@@ -1313,6 +1534,7 @@ export const LANDING_CSS = `
1313
1534
  .doc-tile,
1314
1535
  .protocol-card,
1315
1536
  .protocol-logo-rail div,
1537
+ .runtime-logo-rail div,
1316
1538
  .registry-card {
1317
1539
  animation: none;
1318
1540
  transition: none;
@@ -1329,7 +1551,9 @@ export const LANDING_CSS = `
1329
1551
  justify-content: stretch;
1330
1552
  overflow-x: auto;
1331
1553
  padding-bottom: 2px;
1554
+ scrollbar-width: none;
1332
1555
  }
1556
+ .nav-center::-webkit-scrollbar { display: none; }
1333
1557
  .nav-center > * {
1334
1558
  flex: 0 0 auto;
1335
1559
  }
@@ -1400,6 +1624,9 @@ export const LANDING_CSS = `
1400
1624
  min-height: 680px;
1401
1625
  margin: 36px 0 0;
1402
1626
  }
1627
+ .machine-part {
1628
+ width: min(230px, 34vw);
1629
+ }
1403
1630
  .docs-grid {
1404
1631
  grid-template-columns: repeat(2, minmax(0, 1fr));
1405
1632
  }
@@ -1415,10 +1642,91 @@ export const LANDING_CSS = `
1415
1642
 
1416
1643
  @media (max-width: 640px) {
1417
1644
  .page-shell,
1418
- .site-nav {
1645
+ .site-nav,
1646
+ .runtime-logo-strip {
1419
1647
  width: min(calc(100% - 24px), var(--content));
1420
1648
  }
1421
- h1 { font-size: 42px; }
1649
+ .site-nav {
1650
+ grid-template-columns: 1fr auto;
1651
+ align-items: center;
1652
+ top: 8px;
1653
+ margin-top: 8px;
1654
+ padding: 10px;
1655
+ border-radius: 22px;
1656
+ gap: 10px;
1657
+ }
1658
+ .nav-center,
1659
+ .nav-actions {
1660
+ display: none;
1661
+ }
1662
+ .mobile-nav-toggle,
1663
+ .mobile-nav-backdrop,
1664
+ .mobile-nav-panel {
1665
+ display: grid;
1666
+ }
1667
+ .mobile-nav-backdrop {
1668
+ display: block;
1669
+ }
1670
+ .mobile-nav-panel {
1671
+ display: block;
1672
+ }
1673
+ .brand img {
1674
+ width: 38px;
1675
+ height: 38px;
1676
+ border-radius: 11px;
1677
+ }
1678
+ .brand strong {
1679
+ font-size: 14px;
1680
+ }
1681
+ .brand span span {
1682
+ font-size: 11px;
1683
+ }
1684
+ .nav-pill,
1685
+ .nav-dropdown summary,
1686
+ .nav-actions a,
1687
+ .button {
1688
+ min-height: 40px;
1689
+ padding: 9px 12px;
1690
+ font-size: 13px;
1691
+ }
1692
+ .version-pill {
1693
+ padding: 8px 10px;
1694
+ font-size: 12px;
1695
+ }
1696
+ .nav-menu {
1697
+ width: calc(100vw - 28px);
1698
+ max-height: min(68vh, 480px);
1699
+ border-radius: 18px;
1700
+ }
1701
+ .runtime-logo-rail {
1702
+ border-radius: 999px;
1703
+ padding: 7px;
1704
+ mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
1705
+ }
1706
+ .runtime-logo-rail div {
1707
+ width: max-content;
1708
+ flex-wrap: nowrap;
1709
+ animation: runtimeRail 30s linear infinite;
1710
+ }
1711
+ .runtime-logo-item {
1712
+ flex: 0 0 auto;
1713
+ justify-content: flex-start;
1714
+ min-height: 38px;
1715
+ padding: 6px 13px 6px 7px;
1716
+ font-size: 13px;
1717
+ }
1718
+ .runtime-logo-item img {
1719
+ width: 26px;
1720
+ height: 26px;
1721
+ }
1722
+ .runtime-logo-item strong {
1723
+ font-size: 12px;
1724
+ }
1725
+ h1 {
1726
+ max-width: 12ch;
1727
+ font-size: 42px;
1728
+ line-height: .92;
1729
+ }
1422
1730
  .section h2 { font-size: 34px; }
1423
1731
  .lead { font-size: 18px; }
1424
1732
  .hero {
@@ -1431,32 +1739,85 @@ export const LANDING_CSS = `
1431
1739
  width: 100%;
1432
1740
  }
1433
1741
  .hero-visual {
1434
- min-height: 500px;
1742
+ min-height: 410px;
1435
1743
  border-radius: 24px;
1436
1744
  }
1745
+ .terminal-strip {
1746
+ left: 14px;
1747
+ right: 14px;
1748
+ top: 14px;
1749
+ }
1750
+ .terminal-strip code {
1751
+ max-width: 170px;
1752
+ overflow: hidden;
1753
+ text-overflow: ellipsis;
1754
+ white-space: nowrap;
1755
+ }
1437
1756
  .orbital-engine {
1438
- inset: 78px 12px 132px;
1757
+ inset: 76px 10px 104px;
1439
1758
  }
1440
- .orbit-chip {
1441
- width: 92px;
1442
- padding: 10px;
1443
- font-size: 12px;
1759
+ .orbit {
1760
+ width: min(66%, 280px);
1761
+ }
1762
+ .orbit-b {
1763
+ width: min(50%, 220px);
1764
+ }
1765
+ .orbit-c {
1766
+ width: min(34%, 160px);
1767
+ }
1768
+ .orbit-core {
1769
+ width: 112px;
1770
+ height: 112px;
1771
+ border-radius: 26px;
1444
1772
  }
1445
- .chip-a,
1446
- .chip-c {
1447
- left: 4%;
1773
+ .orbit-core img {
1774
+ width: 42px;
1775
+ height: 42px;
1776
+ border-radius: 13px;
1448
1777
  }
1449
- .chip-b,
1450
- .chip-d {
1451
- right: 4%;
1778
+ .orbit-core strong {
1779
+ font-size: 22px;
1780
+ }
1781
+ .orbit-chip {
1782
+ display: none;
1452
1783
  }
1453
1784
  .hero-bento-mini {
1454
- grid-template-columns: 1fr;
1785
+ left: 14px;
1786
+ right: 14px;
1787
+ bottom: 14px;
1788
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1789
+ gap: 8px;
1790
+ }
1791
+ .hero-bento-mini div {
1792
+ border-radius: 13px;
1793
+ padding: 10px;
1794
+ }
1795
+ .hero-bento-mini span {
1796
+ font-size: 9px;
1797
+ }
1798
+ .hero-bento-mini strong {
1799
+ font-size: 18px;
1455
1800
  }
1456
1801
  .bento-header h2,
1457
1802
  .docs-launchpad h2,
1458
- .machine-copy h2 {
1803
+ .machine-copy h2,
1804
+ .bento-sticky-copy h2 {
1459
1805
  font-size: 38px;
1806
+ line-height: .95;
1807
+ }
1808
+ .bento-sticky-copy {
1809
+ padding-bottom: 0;
1810
+ }
1811
+ .bento-card,
1812
+ .protocol-card {
1813
+ min-height: 230px;
1814
+ border-radius: 22px;
1815
+ padding: 18px;
1816
+ }
1817
+ .bento-card h3,
1818
+ .protocol-card strong {
1819
+ font-size: 30px;
1820
+ line-height: 1;
1460
1821
  }
1461
1822
  .machine-stage {
1462
1823
  display: grid;
@@ -1490,6 +1851,22 @@ export const LANDING_CSS = `
1490
1851
  .registry-card {
1491
1852
  grid-template-columns: 1fr;
1492
1853
  }
1854
+ .registry-card {
1855
+ grid-template-columns: 56px 1fr;
1856
+ border-radius: 22px;
1857
+ }
1858
+ .registry-logo {
1859
+ width: 56px;
1860
+ height: 56px;
1861
+ border-radius: 18px;
1862
+ }
1863
+ .registry-logo img {
1864
+ width: 34px;
1865
+ height: 34px;
1866
+ }
1867
+ .registry-status {
1868
+ grid-column: 1 / -1;
1869
+ }
1493
1870
  .protocol-logo-rail {
1494
1871
  width: min(210px, 54%);
1495
1872
  }
@@ -1529,6 +1906,73 @@ export const LANDING_CSS = `
1529
1906
  .download-card {
1530
1907
  min-height: 96px;
1531
1908
  }
1909
+ .endpoint-row {
1910
+ grid-template-columns: 44px minmax(0, 1fr);
1911
+ gap: 9px;
1912
+ }
1913
+ .method-badge {
1914
+ min-width: 40px;
1915
+ height: 24px;
1916
+ padding: 0 7px;
1917
+ font-size: 9px;
1918
+ }
1919
+ .footer {
1920
+ padding: 48px 0 34px;
1921
+ font-size: 14px;
1922
+ }
1923
+ .footer-grid {
1924
+ gap: 20px;
1925
+ padding-top: 18px;
1926
+ }
1927
+ .footer strong {
1928
+ font-size: 15px;
1929
+ }
1930
+ .footer p {
1931
+ margin-bottom: 0;
1932
+ font-size: 14px;
1933
+ line-height: 1.45;
1934
+ }
1935
+ .footer a {
1936
+ padding: 4px 0;
1937
+ font-size: 14px;
1938
+ line-height: 1.35;
1939
+ }
1940
+ }
1941
+
1942
+ @media (max-width: 420px) {
1943
+ .hero-actions,
1944
+ .inline-actions {
1945
+ gap: 8px;
1946
+ }
1947
+ h1 {
1948
+ font-size: 36px;
1949
+ }
1950
+ .lead {
1951
+ font-size: 16px;
1952
+ }
1953
+ .hero-visual {
1954
+ min-height: 388px;
1955
+ }
1956
+ .terminal-strip code {
1957
+ max-width: 138px;
1958
+ }
1959
+ .section {
1960
+ padding: 64px 0;
1961
+ }
1962
+ .machine-section {
1963
+ padding-left: 12px;
1964
+ padding-right: 12px;
1965
+ }
1966
+ .download-action,
1967
+ .download-card {
1968
+ grid-template-columns: 42px 1fr;
1969
+ }
1970
+ .download-action .os-mark,
1971
+ .os-mark {
1972
+ width: 42px;
1973
+ height: 42px;
1974
+ border-radius: 13px;
1975
+ }
1532
1976
  }
1533
1977
  `;
1534
1978
  //# sourceMappingURL=styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/remote/public-home/styles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAw/C1B,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/remote/public-home/styles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAo7D1B,CAAC"}
@@ -65,6 +65,8 @@ export interface LandingPublicPaymentStats {
65
65
  totalPaymentRequests: number;
66
66
  totalVerifiedPayments: number;
67
67
  totalFailedSettlements: number;
68
+ uniqueRemoteCallers: number;
69
+ uniqueUserAgents: number;
68
70
  lastSettlementAt?: string;
69
71
  ledgerAvailable: boolean;
70
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/remote/public-home/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7C;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE;YACb,aAAa,EAAE,MAAM,CAAC;YACtB,eAAe,EAAE,MAAM,CAAC;YACxB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE;YACZ,IAAI,EAAE,oBAAoB,CAAC;YAC3B,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,uBAAuB,CAAC;IAC9B,YAAY,EAAE,yBAAyB,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/remote/public-home/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7C;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE;YACb,aAAa,EAAE,MAAM,CAAC;YACtB,eAAe,EAAE,MAAM,CAAC;YACxB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE;YACZ,IAAI,EAAE,oBAAoB,CAAC;YAC3B,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,uBAAuB,CAAC;IAC9B,YAAY,EAAE,yBAAyB,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B"}
@@ -30,6 +30,7 @@ export declare class RemoteRateLimiter {
30
30
  private readonly config;
31
31
  private readonly localEntries;
32
32
  private readonly redis?;
33
+ private readonly cleanupInterval?;
33
34
  constructor(config: RemoteRateLimitConfig);
34
35
  /**
35
36
  * @name initialize
@@ -48,6 +49,7 @@ export declare class RemoteRateLimiter {
48
49
  close(): Promise<void>;
49
50
  private checkRedis;
50
51
  private checkLocal;
52
+ private cleanupLocal;
51
53
  }
52
54
  /**
53
55
  * @name buildRemoteRateLimitConfigFromEnv
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/remote/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0C;IACvE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAA6B;gBAEjC,MAAM,EAAE,qBAAqB;IAchD;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxC;;;OAGG;IACU,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiBvE;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAIrB,UAAU;IAiBxB,OAAO,CAAC,UAAU;CAmBnB;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,gBAAgB,EAAE,MAAM,GAAG,qBAAqB,CAajG"}
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/remote/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0C;IACvE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;gBAE/B,MAAM,EAAE,qBAAqB;IAkBhD;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxC;;;OAGG;IACU,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiBvE;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAOrB,UAAU;IAiBxB,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,YAAY;CAgBrB;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,gBAAgB,EAAE,MAAM,GAAG,qBAAqB,CAajG"}
@@ -14,6 +14,7 @@ export class RemoteRateLimiter {
14
14
  config;
15
15
  localEntries = new Map();
16
16
  redis;
17
+ cleanupInterval;
17
18
  constructor(config) {
18
19
  this.config = config;
19
20
  if (config.redisUrl) {
@@ -25,7 +26,10 @@ export class RemoteRateLimiter {
25
26
  this.redis.on('error', (error) => {
26
27
  logger.warn('Remote rate limiter Redis error', { error });
27
28
  });
29
+ return;
28
30
  }
31
+ this.cleanupInterval = setInterval(() => this.cleanupLocal(), WINDOW_MS);
32
+ this.cleanupInterval.unref?.();
29
33
  }
30
34
  /**
31
35
  * @name initialize
@@ -61,6 +65,9 @@ export class RemoteRateLimiter {
61
65
  * @description Closes the optional Redis connection.
62
66
  */
63
67
  async close() {
68
+ if (this.cleanupInterval) {
69
+ clearInterval(this.cleanupInterval);
70
+ }
64
71
  await this.redis?.quit();
65
72
  }
66
73
  async checkRedis(clientKey) {
@@ -95,6 +102,22 @@ export class RemoteRateLimiter {
95
102
  resetSeconds,
96
103
  };
97
104
  }
105
+ cleanupLocal() {
106
+ const now = Date.now();
107
+ let cleaned = 0;
108
+ for (const [key, entry] of this.localEntries.entries()) {
109
+ if (entry.resetAt <= now) {
110
+ this.localEntries.delete(key);
111
+ cleaned += 1;
112
+ }
113
+ }
114
+ if (cleaned > 0) {
115
+ logger.debug('Remote rate limiter local cleanup', {
116
+ cleaned,
117
+ activeKeys: this.localEntries.size,
118
+ });
119
+ }
120
+ }
98
121
  }
99
122
  /**
100
123
  * @name buildRemoteRateLimitConfigFromEnv