station-kit 1.1.0 → 2.0.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.
Files changed (177) hide show
  1. package/.next/standalone/packages/station-kit/.next/BUILD_ID +1 -1
  2. package/.next/standalone/packages/station-kit/.next/app-build-manifest.json +55 -34
  3. package/.next/standalone/packages/station-kit/.next/app-path-routes-manifest.json +11 -8
  4. package/.next/standalone/packages/station-kit/.next/build-manifest.json +2 -2
  5. package/.next/standalone/packages/station-kit/.next/prerender-manifest.json +73 -25
  6. package/.next/standalone/packages/station-kit/.next/routes-manifest.json +20 -0
  7. package/.next/standalone/packages/station-kit/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/packages/station-kit/.next/server/app/_not-found.html +1 -1
  9. package/.next/standalone/packages/station-kit/.next/server/app/_not-found.rsc +8 -8
  10. package/.next/standalone/packages/station-kit/.next/server/app/beacons/[name]/page.js +2 -0
  11. package/.next/standalone/packages/station-kit/.next/server/app/beacons/[name]/page.js.nft.json +1 -0
  12. package/.next/standalone/packages/station-kit/.next/server/app/beacons/[name]/page_client-reference-manifest.js +1 -0
  13. package/.next/standalone/packages/station-kit/.next/server/app/beacons/page.js +2 -0
  14. package/.next/standalone/packages/station-kit/.next/server/app/beacons/page.js.nft.json +1 -0
  15. package/.next/standalone/packages/station-kit/.next/server/app/beacons/page_client-reference-manifest.js +1 -0
  16. package/.next/standalone/packages/station-kit/.next/server/app/beacons.html +1 -0
  17. package/.next/standalone/packages/station-kit/.next/server/app/beacons.meta +7 -0
  18. package/.next/standalone/packages/station-kit/.next/server/app/beacons.rsc +25 -0
  19. package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/[id]/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/dyn/[name]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/dyn/[name]/v/[n]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/new/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/new.html +1 -1
  24. package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/new.rsc +9 -9
  25. package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/packages/station-kit/.next/server/app/broadcasts.html +1 -1
  27. package/.next/standalone/packages/station-kit/.next/server/app/broadcasts.rsc +9 -9
  28. package/.next/standalone/packages/station-kit/.next/server/app/environment/page.js +2 -0
  29. package/.next/standalone/packages/station-kit/.next/server/app/environment/page.js.nft.json +1 -0
  30. package/.next/standalone/packages/station-kit/.next/server/app/environment/page_client-reference-manifest.js +1 -0
  31. package/.next/standalone/packages/station-kit/.next/server/app/environment.html +1 -0
  32. package/.next/standalone/packages/station-kit/.next/server/app/environment.meta +7 -0
  33. package/.next/standalone/packages/station-kit/.next/server/app/environment.rsc +25 -0
  34. package/.next/standalone/packages/station-kit/.next/server/app/index.html +1 -1
  35. package/.next/standalone/packages/station-kit/.next/server/app/index.rsc +9 -9
  36. package/.next/standalone/packages/station-kit/.next/server/app/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/packages/station-kit/.next/server/app/playground/expression/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/packages/station-kit/.next/server/app/playground/expression.html +1 -1
  39. package/.next/standalone/packages/station-kit/.next/server/app/playground/expression.rsc +9 -9
  40. package/.next/standalone/packages/station-kit/.next/server/app/runs/[id]/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/packages/station-kit/.next/server/app/schedules/[id]/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/packages/station-kit/.next/server/app/schedules/new/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/packages/station-kit/.next/server/app/schedules/new.html +1 -1
  44. package/.next/standalone/packages/station-kit/.next/server/app/schedules/new.rsc +9 -9
  45. package/.next/standalone/packages/station-kit/.next/server/app/schedules/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/packages/station-kit/.next/server/app/schedules.html +1 -1
  47. package/.next/standalone/packages/station-kit/.next/server/app/schedules.rsc +9 -9
  48. package/.next/standalone/packages/station-kit/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/packages/station-kit/.next/server/app/settings.html +1 -1
  50. package/.next/standalone/packages/station-kit/.next/server/app/settings.rsc +9 -9
  51. package/.next/standalone/packages/station-kit/.next/server/app/signals/[name]/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/packages/station-kit/.next/server/app/signals/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/packages/station-kit/.next/server/app/signals.html +1 -1
  54. package/.next/standalone/packages/station-kit/.next/server/app/signals.rsc +9 -9
  55. package/.next/standalone/packages/station-kit/.next/server/app-paths-manifest.json +11 -8
  56. package/.next/standalone/packages/station-kit/.next/server/chunks/102.js +1 -1
  57. package/.next/standalone/packages/station-kit/.next/server/pages/404.html +1 -1
  58. package/.next/standalone/packages/station-kit/.next/server/pages/500.html +1 -1
  59. package/.next/standalone/packages/station-kit/.next/server/pages-manifest.json +1 -1
  60. package/.next/standalone/packages/station-kit/.next/server/server-reference-manifest.json +1 -1
  61. package/.next/standalone/packages/station-kit/.next/static/chunks/285-583f23ee7827983f.js +1 -0
  62. package/.next/standalone/packages/station-kit/.next/static/chunks/561-05a7ef9669e3921a.js +1 -0
  63. package/.next/standalone/packages/station-kit/.next/static/chunks/app/beacons/[name]/page-eb1f82847734e145.js +1 -0
  64. package/.next/standalone/packages/station-kit/.next/static/chunks/app/beacons/page-64e296346197e44b.js +1 -0
  65. package/.next/standalone/packages/station-kit/.next/static/chunks/app/broadcasts/dyn/[name]/v/[n]/page-15edf07ab26241c9.js +1 -0
  66. package/.next/standalone/packages/station-kit/.next/static/chunks/app/broadcasts/page-b23a03097c8f75c4.js +1 -0
  67. package/.next/standalone/packages/station-kit/.next/static/chunks/app/environment/page-111242bec067fdee.js +1 -0
  68. package/.next/standalone/packages/station-kit/.next/static/chunks/app/layout-e9ac56fcaf7a5ea7.js +1 -0
  69. package/.next/standalone/packages/station-kit/.next/static/chunks/app/page-ef78692958c2fc01.js +1 -0
  70. package/.next/standalone/packages/station-kit/.next/static/chunks/app/playground/expression/page-29294a705dd8f471.js +1 -0
  71. package/.next/standalone/packages/station-kit/.next/static/chunks/app/runs/[id]/page-287bbb8f6dec2e23.js +1 -0
  72. package/.next/standalone/packages/station-kit/.next/static/chunks/app/schedules/page-c869218da203e3b4.js +1 -0
  73. package/.next/standalone/packages/station-kit/.next/static/chunks/app/settings/page-05cf43b6ae6b3187.js +1 -0
  74. package/.next/standalone/packages/station-kit/.next/static/chunks/app/signals/[name]/page-4027803be00c695a.js +1 -0
  75. package/.next/standalone/packages/station-kit/.next/static/chunks/app/signals/page-8e076fc5d0188d72.js +1 -0
  76. package/.next/standalone/packages/station-kit/.next/static/css/ddb1646dc25ed100.css +1 -0
  77. package/.next/standalone/packages/station-kit/.next/static/vTGEzSqxhR_E57YAFn9DC/_buildManifest.js +1 -0
  78. package/.next/standalone/packages/station-kit/package.json +4 -1
  79. package/dist/config/schema.d.ts +18 -0
  80. package/dist/config/schema.d.ts.map +1 -1
  81. package/dist/config/schema.js +3 -0
  82. package/dist/config/schema.js.map +1 -1
  83. package/dist/index.d.ts +1 -0
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +3 -0
  86. package/dist/index.js.map +1 -1
  87. package/dist/server/auth/keys.d.ts +18 -1
  88. package/dist/server/auth/keys.d.ts.map +1 -1
  89. package/dist/server/auth/keys.js +38 -6
  90. package/dist/server/auth/keys.js.map +1 -1
  91. package/dist/server/auth/session.d.ts.map +1 -1
  92. package/dist/server/auth/session.js +34 -11
  93. package/dist/server/auth/session.js.map +1 -1
  94. package/dist/server/index.d.ts.map +1 -1
  95. package/dist/server/index.js +135 -18
  96. package/dist/server/index.js.map +1 -1
  97. package/dist/server/metadata.d.ts +2 -0
  98. package/dist/server/metadata.d.ts.map +1 -1
  99. package/dist/server/metadata.js.map +1 -1
  100. package/dist/server/middleware/rate-limit.d.ts.map +1 -1
  101. package/dist/server/middleware/rate-limit.js +22 -1
  102. package/dist/server/middleware/rate-limit.js.map +1 -1
  103. package/dist/server/routes/beacons.d.ts +10 -0
  104. package/dist/server/routes/beacons.d.ts.map +1 -0
  105. package/dist/server/routes/beacons.js +98 -0
  106. package/dist/server/routes/beacons.js.map +1 -0
  107. package/dist/server/routes/broadcasts.d.ts.map +1 -1
  108. package/dist/server/routes/broadcasts.js +6 -2
  109. package/dist/server/routes/broadcasts.js.map +1 -1
  110. package/dist/server/routes/runs.d.ts.map +1 -1
  111. package/dist/server/routes/runs.js +19 -59
  112. package/dist/server/routes/runs.js.map +1 -1
  113. package/dist/server/routes/signals.d.ts.map +1 -1
  114. package/dist/server/routes/signals.js +17 -13
  115. package/dist/server/routes/signals.js.map +1 -1
  116. package/dist/server/routes/v1/env.d.ts +10 -0
  117. package/dist/server/routes/v1/env.d.ts.map +1 -0
  118. package/dist/server/routes/v1/env.js +132 -0
  119. package/dist/server/routes/v1/env.js.map +1 -0
  120. package/dist/server/routes/v1/events.js +2 -2
  121. package/dist/server/routes/v1/events.js.map +1 -1
  122. package/dist/server/routes/v1/runs.d.ts.map +1 -1
  123. package/dist/server/routes/v1/runs.js +10 -31
  124. package/dist/server/routes/v1/runs.js.map +1 -1
  125. package/dist/server/sse.d.ts +2 -1
  126. package/dist/server/sse.d.ts.map +1 -1
  127. package/dist/server/sse.js +5 -1
  128. package/dist/server/sse.js.map +1 -1
  129. package/dist/server/subscriber.d.ts +56 -0
  130. package/dist/server/subscriber.d.ts.map +1 -1
  131. package/dist/server/subscriber.js +94 -0
  132. package/dist/server/subscriber.js.map +1 -1
  133. package/dist/server/ws.d.ts +8 -2
  134. package/dist/server/ws.d.ts.map +1 -1
  135. package/dist/server/ws.js +28 -3
  136. package/dist/server/ws.js.map +1 -1
  137. package/package.json +11 -8
  138. package/src/app/beacons/[name]/beacon-detail.tsx +253 -0
  139. package/src/app/beacons/[name]/page.tsx +6 -0
  140. package/src/app/beacons/page.tsx +98 -0
  141. package/src/app/components/shell.tsx +24 -0
  142. package/src/app/components/status-badge.tsx +13 -1
  143. package/src/app/environment/page.tsx +415 -0
  144. package/src/app/globals.css +48 -0
  145. package/src/app/hooks/use-api.ts +80 -0
  146. package/src/config/schema.ts +21 -0
  147. package/src/index.ts +12 -0
  148. package/src/server/auth/keys.ts +50 -5
  149. package/src/server/auth/session.ts +38 -11
  150. package/src/server/index.ts +144 -18
  151. package/src/server/metadata.ts +2 -0
  152. package/src/server/middleware/rate-limit.ts +20 -1
  153. package/src/server/routes/beacons.ts +112 -0
  154. package/src/server/routes/broadcasts.ts +6 -2
  155. package/src/server/routes/runs.ts +20 -67
  156. package/src/server/routes/signals.ts +17 -13
  157. package/src/server/routes/v1/env.ts +144 -0
  158. package/src/server/routes/v1/events.ts +2 -2
  159. package/src/server/routes/v1/runs.ts +11 -35
  160. package/src/server/sse.ts +7 -2
  161. package/src/server/subscriber.ts +111 -0
  162. package/src/server/ws.ts +38 -4
  163. package/.next/standalone/packages/station-kit/.next/static/THKSkCipW_pj0F6DRXYEG/_buildManifest.js +0 -1
  164. package/.next/standalone/packages/station-kit/.next/static/chunks/285-ff198f0a909c4fdd.js +0 -1
  165. package/.next/standalone/packages/station-kit/.next/static/chunks/561-33d912169940283e.js +0 -1
  166. package/.next/standalone/packages/station-kit/.next/static/chunks/app/broadcasts/dyn/[name]/v/[n]/page-5eac0507f49a00ec.js +0 -1
  167. package/.next/standalone/packages/station-kit/.next/static/chunks/app/broadcasts/page-dee500ccc01f0821.js +0 -1
  168. package/.next/standalone/packages/station-kit/.next/static/chunks/app/layout-e14e14f3e5b0b8a9.js +0 -1
  169. package/.next/standalone/packages/station-kit/.next/static/chunks/app/page-aac41ef7a470daab.js +0 -1
  170. package/.next/standalone/packages/station-kit/.next/static/chunks/app/playground/expression/page-dc9d91f3f50f4716.js +0 -1
  171. package/.next/standalone/packages/station-kit/.next/static/chunks/app/runs/[id]/page-9e4c4f751a4bea72.js +0 -1
  172. package/.next/standalone/packages/station-kit/.next/static/chunks/app/schedules/page-738d98dc0b63166e.js +0 -1
  173. package/.next/standalone/packages/station-kit/.next/static/chunks/app/settings/page-fc5654b31f57ac21.js +0 -1
  174. package/.next/standalone/packages/station-kit/.next/static/chunks/app/signals/[name]/page-4b1c09a539a1ebcd.js +0 -1
  175. package/.next/standalone/packages/station-kit/.next/static/chunks/app/signals/page-d2f2403dfede87cc.js +0 -1
  176. package/.next/standalone/packages/station-kit/.next/static/css/0be0e65a5f561f37.css +0 -1
  177. /package/.next/standalone/packages/station-kit/.next/static/{THKSkCipW_pj0F6DRXYEG → vTGEzSqxhR_E57YAFn9DC}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ :root{--rust:#8B5A2B;--rust-light:#A0622D;--rust-pale:#C4834A;--patina:#4A6741;--patina-light:#5C7C52;--signal-green:#6B9962;--concrete:#F4F1EC;--concrete-dark:#E8E4DC;--concrete-mid:#D4CEBF;--charcoal:#1C1C1E;--charcoal-mid:#2C2C2E;--wire:#3A3A3C;--muted:#8A8A8E;--muted-light:#AEAEB2;--sky:#7FB2CC;--surface:#FFFFFF;--code-bg:#1C1C1E;--code-text:#F4F1EC;--code-key:#AEAEB2;--code-string:#C4834A;--code-number:#7FB2CC;--code-bool:#5C7C52;--code-null:#8A8A8E;--font-display:"Instrument Serif",serif;--font-mono:"IBM Plex Mono",monospace;--font-body:"Space Grotesk",sans-serif;--ease-standard:cubic-bezier(0.25,0.46,0.45,0.94);--ease-enter:cubic-bezier(0.0,0.0,0.2,1.0);--ease-exit:cubic-bezier(0.4,0.0,1.0,1.0);--duration-pulse:2.4s;--duration-blink:3s;--duration-reveal:500ms;--delay-stagger:120ms;--border-width:1.5px;--sidebar-width:200px;--header-height:48px}[data-theme=dark]{--rust:#C4834A;--rust-light:#D4975C;--rust-pale:#E0A86A;--patina:#6B9962;--patina-light:#7DAF72;--signal-green:#8BB882;--concrete:#1A1A1C;--concrete-dark:#252527;--concrete-mid:#3A3A3C;--charcoal:#E8E4DC;--charcoal-mid:#C4C0B8;--wire:#4A4A4C;--muted:#8A8A8E;--muted-light:#6A6A6E;--sky:#8FC2DC;--surface:#222224;--code-bg:#111113}[data-theme=dark] .station-sidebar{--charcoal:#1C1C1E;--charcoal-mid:#2C2C2E;--wire:#3A3A3C;--concrete:#F4F1EC;--concrete-dark:#E8E4DC;--muted:#8A8A8E;--muted-light:#AEAEB2;--rust:#8B5A2B}[data-theme=dark] .status-badge--running{background:rgba(107,153,98,.2)}[data-theme=dark] .status-badge--completed{background:rgba(74,103,65,.18)}[data-theme=dark] .status-badge--failed{background:rgba(196,131,74,.15)}@keyframes signal-pulse{0%{box-shadow:0 0 0 0 rgba(107,153,98,.4)}70%{box-shadow:0 0 0 6px rgba(107,153,98,0)}to{box-shadow:0 0 0 0 rgba(107,153,98,0)}}@keyframes status-blink{0%,45%,55%,to{opacity:1}50%{opacity:.15}}@keyframes stagger-reveal{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes load-sweep{0%{width:0}15%{width:15%}40%{width:45%}70%{width:70%}90%{width:90%}to{width:100%}}*,:after,:before{box-sizing:border-box;margin:0;padding:0}html{font-size:16px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--font-body);font-weight:300;color:var(--charcoal);background-color:var(--concrete);line-height:1.5}a{color:var(--rust);text-decoration:none}a:hover{color:var(--rust-light)}.font-display{font-family:var(--font-display);font-weight:400}.font-mono{font-family:var(--font-mono);font-size:.875rem}.font-body{font-family:var(--font-body);font-weight:300}.section-label{font-family:var(--font-mono);font-size:.65rem;text-transform:uppercase;letter-spacing:.22em;color:var(--rust);display:flex;align-items:center;gap:.5rem}.section-label:before{content:"";display:block;width:1.5rem;height:var(--border-width);background:var(--rust)}.station-layout{display:flex;min-height:100vh}.station-sidebar{width:var(--sidebar-width);background:var(--charcoal);color:var(--concrete);display:flex;flex-direction:column;position:fixed;top:0;left:0;bottom:0;z-index:10;transition:width .2s var(--ease-standard);overflow:hidden}.station-sidebar-logo{padding:1rem 1rem .75rem;border-bottom:var(--border-width) solid var(--wire)}.station-sidebar-mark{display:flex;align-items:center;gap:.5rem;color:var(--concrete)}.station-sidebar-mark svg{flex-shrink:0;opacity:.85}.station-sidebar-logo h1{font-family:var(--font-display);font-size:1.125rem;font-weight:400;color:var(--concrete);line-height:1}.station-sidebar-logo span{display:block;font-family:var(--font-mono);font-size:.5625rem;color:var(--muted);text-transform:uppercase;letter-spacing:.15em;margin-top:.375rem}.station-sidebar-nav{padding:.5rem 0;flex:1 1}.station-sidebar-nav-label{font-family:var(--font-mono);font-size:.5625rem;text-transform:uppercase;letter-spacing:.2em;color:var(--muted);padding:.5rem 1rem .25rem}.station-sidebar-nav a{display:flex;align-items:center;gap:.5rem;padding:.375rem 1rem;font-family:var(--font-mono);font-size:.8125rem;color:var(--muted-light);border-left:2px solid transparent;transition:color .2s var(--ease-standard),background .2s var(--ease-standard)}.station-sidebar-nav a svg{flex-shrink:0;opacity:.7;transition:opacity .2s var(--ease-standard)}.station-sidebar-nav a:hover{color:var(--concrete);background:var(--charcoal-mid)}.station-sidebar-nav a:hover svg{opacity:1}.station-sidebar-nav a.active{color:var(--concrete);background:var(--wire);border-left:2px solid var(--rust)}.station-sidebar-nav a.active svg{opacity:1}.sidebar-collapse-btn{display:flex;align-items:center;justify-content:center;width:100%;padding:.5rem;border:none;border-top:var(--border-width) solid var(--wire);background:transparent;color:var(--muted);cursor:pointer;transition:color .2s var(--ease-standard),background .2s var(--ease-standard)}.sidebar-collapse-btn:hover{color:var(--concrete);background:var(--charcoal-mid)}[data-collapsed=true] .station-sidebar{width:48px}[data-collapsed=true] .station-main{margin-left:48px}[data-collapsed=true] .nav-label,[data-collapsed=true] .station-sidebar-logo h1,[data-collapsed=true] .station-sidebar-logo>span,[data-collapsed=true] .station-sidebar-nav-label{display:none}[data-collapsed=true] .station-sidebar-logo{padding:.75rem;display:flex;justify-content:center}[data-collapsed=true] .station-sidebar-mark{justify-content:center}[data-collapsed=true] .station-sidebar-nav a{justify-content:center;padding:.5rem;border-left-color:transparent}[data-collapsed=true] .station-sidebar-nav a.active{border-left-color:transparent}.station-main{margin-left:var(--sidebar-width);flex:1 1;display:flex;flex-direction:column;transition:margin-left .2s var(--ease-standard)}.station-header{height:var(--header-height);background:var(--concrete);border-bottom:var(--border-width) solid var(--concrete-dark);justify-content:space-between;padding:0 1.5rem;position:-webkit-sticky;position:sticky;top:0;z-index:5}.breadcrumb,.station-header{display:flex;align-items:center}.breadcrumb{font-family:var(--font-mono);font-size:.75rem;color:var(--muted);gap:0}.breadcrumb-item{display:inline-flex;align-items:center}.breadcrumb-sep{margin:0 .375rem;color:var(--concrete-mid);-webkit-user-select:none;-moz-user-select:none;user-select:none}.breadcrumb-link{color:var(--muted);text-decoration:none;transition:color .15s var(--ease-standard);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.breadcrumb-link:hover{color:var(--rust)}.breadcrumb-segment{color:var(--muted)}.breadcrumb-segment--current{color:var(--charcoal);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.station-content{flex:1 1;padding:1.5rem;max-width:1100px}.status-badge{display:inline-flex;align-items:center;gap:.375rem;padding:.125rem .5rem;border-radius:3px;font-family:var(--font-mono);font-size:.6875rem;text-transform:uppercase;letter-spacing:.05em;line-height:1.6}.status-badge-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.status-badge--pending{background:var(--concrete-dark);color:var(--muted)}.status-badge--pending .status-badge-dot{background:var(--muted)}.status-badge--running{background:rgba(74,103,65,.12);color:var(--patina)}.status-badge--running .status-badge-dot{background:var(--signal-green);animation:status-blink var(--duration-blink) ease-in-out infinite}.status-badge--completed{background:rgba(74,103,65,.1);color:var(--patina)}.status-badge--completed .status-badge-dot{background:var(--patina)}.status-badge--failed{background:rgba(139,90,43,.1);color:var(--rust)}.status-badge--failed .status-badge-dot{background:var(--rust)}.status-badge--cancelled{background:rgba(58,58,60,.08);color:var(--muted)}.status-badge--cancelled .status-badge-dot{background:var(--wire)}.status-badge--skipped{background:transparent;color:var(--muted);border:var(--border-width) dashed var(--muted-light)}.status-badge--skipped .status-badge-dot{background:var(--muted-light)}.status-badge--stopped{background:rgba(58,58,60,.08);color:var(--muted)}.status-badge--stopped .status-badge-dot{background:var(--wire)}.status-badge--starting{background:rgba(139,90,43,.1);color:var(--rust)}.status-badge--starting .status-badge-dot{background:var(--rust-pale);animation:status-blink var(--duration-blink) ease-in-out infinite}.status-badge--stopping{background:rgba(139,90,43,.08);color:var(--rust-light)}.status-badge--stopping .status-badge-dot{background:var(--rust-pale);animation:status-blink var(--duration-blink) ease-in-out infinite}.status-badge--backoff{background:rgba(139,90,43,.08);color:var(--rust-light)}.status-badge--backoff .status-badge-dot{background:var(--rust-pale)}.status-badge--errored{background:rgba(139,90,43,.1);color:var(--rust)}.status-badge--errored .status-badge-dot{background:var(--rust)}.station-table{width:100%;border-collapse:collapse;font-family:var(--font-body);font-size:.875rem}.station-table th{font-family:var(--font-mono);font-size:.6875rem;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);text-align:left;padding:.5rem .75rem;border-bottom:var(--border-width) solid var(--concrete-dark);font-weight:400}.station-table td{padding:.625rem .75rem;border-bottom:1px solid var(--concrete-dark);vertical-align:middle}.station-table tr:hover td{background:var(--concrete-dark)}.station-table .mono{font-family:var(--font-mono);font-size:.8125rem}.station-table .truncate{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.station-card{background:var(--surface);border:var(--border-width) solid var(--concrete-dark);border-radius:4px;padding:1.25rem}.station-card h3{font-family:var(--font-display);font-size:1.125rem;margin-bottom:.75rem}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));grid-gap:.75rem;gap:.75rem;margin-bottom:1.5rem}.stat-card{background:var(--surface);border:var(--border-width) solid var(--concrete-dark);border-radius:4px;padding:1rem}.stat-card-label{font-family:var(--font-mono);font-size:.625rem;text-transform:uppercase;letter-spacing:.15em;color:var(--muted);margin-bottom:.25rem}.stat-card-value{font-family:var(--font-display);font-size:2rem;color:var(--charcoal);line-height:1.1}.pulse-dot{width:8px;height:8px;border-radius:50%;background:var(--signal-green);animation:signal-pulse var(--duration-pulse) ease-out infinite}.pulse-dot--disconnected{background:var(--muted);animation:none}.step-timeline{position:relative;padding-left:1.5rem}.step-timeline:before{content:"";position:absolute;left:5px;top:0;bottom:0;width:var(--border-width);background:var(--concrete-dark)}.step-timeline-item{position:relative;padding:.75rem 0}.step-timeline-dot{position:absolute;left:-1.5rem;top:1rem;width:10px;height:10px;border-radius:50%;border:var(--border-width) solid var(--concrete-dark);background:var(--surface);transform:translateX(-50%);left:calc(-1.5rem + 5px)}.step-timeline-dot--completed{background:var(--patina);border-color:var(--patina)}.step-timeline-dot--running{background:var(--signal-green);border-color:var(--signal-green);animation:signal-pulse var(--duration-pulse) ease-out infinite}.step-timeline-dot--failed{background:var(--rust);border-color:var(--rust)}.step-timeline-name{font-family:var(--font-mono);font-size:.8125rem;color:var(--charcoal)}.step-timeline-meta{font-family:var(--font-mono);font-size:.6875rem;color:var(--muted);margin-top:.125rem}.json-viewer{font-family:var(--font-mono);font-size:.8125rem;line-height:1.5;background:var(--code-bg);color:var(--code-text);border-radius:4px;padding:1rem;overflow-x:auto}.json-viewer .json-key{color:var(--code-key)}.json-viewer .json-string{color:var(--code-string)}.json-viewer .json-number{color:var(--code-number)}.json-viewer .json-boolean{color:var(--code-bool)}.json-viewer .json-null{color:var(--code-null)}.empty-state{text-align:center;padding:3rem 1rem;color:var(--muted)}.empty-state-text{font-family:var(--font-mono);font-size:.8125rem}.loading-bar{height:var(--border-width);background:var(--concrete-dark);position:relative;overflow:hidden;border-radius:1px}.loading-bar-fill{height:100%;background:var(--rust);animation:load-sweep 3.5s cubic-bezier(.4,0,.2,1) infinite}.dag-container{background:var(--surface);border:var(--border-width) solid var(--concrete-dark);border-radius:4px;padding:1.5rem;overflow-x:auto}.dag-node{cursor:pointer}.dag-node rect{stroke-width:1.5;rx:4;ry:4}.dag-node text{font-family:var(--font-mono);font-size:11px}.dag-edge{fill:none;stroke:var(--concrete-mid);stroke-width:1.5;transition:stroke .3s var(--ease-standard)}.dag-edge--active{stroke:var(--patina);stroke-width:2}.page-title{font-family:var(--font-display);font-size:1.75rem;font-weight:400;margin-bottom:1.5rem;color:var(--charcoal)}.btn{display:inline-flex;align-items:center;gap:.375rem;font-family:var(--font-mono);font-size:.75rem;padding:.375rem .75rem;border:var(--border-width) solid var(--charcoal);border-radius:3px;background:var(--charcoal);color:var(--concrete);cursor:pointer;transition:transform .2s var(--ease-standard),background .2s var(--ease-standard)}.btn:hover{transform:translateY(-2px);background:var(--rust);border-color:var(--rust)}.btn--primary{background:var(--patina);border-color:var(--patina)}.btn--primary:hover{background:var(--patina-light);border-color:var(--patina-light)}.btn--primary:disabled{opacity:.5;cursor:not-allowed;transform:none}.btn--sm{font-size:.6875rem;padding:.25rem .5rem}.btn--danger{background:var(--rust);border-color:var(--rust)}.btn--danger:hover{background:var(--rust-light);border-color:var(--rust-light)}.btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.detail-grid{display:grid;grid-template-columns:auto 1fr;grid-gap:.25rem 1rem;gap:.25rem 1rem;font-size:.875rem}.detail-label{font-family:var(--font-mono);font-size:.75rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}.detail-value{font-family:var(--font-body);color:var(--charcoal)}.detail-value.mono{font-family:var(--font-mono);font-size:.8125rem}.reveal-item{animation:stagger-reveal var(--duration-reveal) var(--ease-standard) both}.input-textarea{width:100%;margin-top:.5rem;padding:.75rem;font-family:var(--font-mono);font-size:.8125rem;line-height:1.5;color:var(--code-text);background:var(--code-bg);border:var(--border-width) solid var(--wire);border-radius:4px;resize:vertical;outline:none}.input-textarea:focus{border-color:var(--patina)}.log-container{background:var(--code-bg);border-radius:4px;max-height:400px;overflow-y:auto;overflow-x:auto}.log-line{display:flex;gap:.625rem;padding:.125rem .75rem;font-family:var(--font-mono);font-size:.75rem;line-height:1.6;border-bottom:1px solid var(--wire)}.log-line:last-of-type{border-bottom:none}.log-timestamp{min-width:5.5rem}.log-level,.log-timestamp{color:var(--muted);flex-shrink:0}.log-level{min-width:2rem}.log-level[data-level=stderr]{color:var(--rust-pale)}.log-message{color:var(--code-text);white-space:pre-wrap;word-break:break-all}.schema-ref{border:var(--border-width) solid var(--concrete-dark);border-radius:4px;padding:.75rem;background:var(--surface);margin-bottom:.75rem}.schema-ref-title{font-family:var(--font-mono);font-size:.625rem;text-transform:uppercase;letter-spacing:.15em;color:var(--muted);margin-bottom:.5rem}.schema-field{display:flex;justify-content:space-between;padding:.25rem 0;font-family:var(--font-mono);font-size:.8125rem;border-bottom:1px solid var(--concrete-dark)}.schema-field:last-child{border-bottom:none}.schema-field-name{color:var(--charcoal)}.schema-field-type{color:var(--muted)}.schema-field-type--optional:after{content:"?";color:var(--rust-pale)}.error-block{background:rgba(139,90,43,.08);border:var(--border-width) solid rgba(139,90,43,.2);border-radius:4px;padding:.75rem 1rem;font-size:.8125rem;color:var(--rust);white-space:pre-wrap;word-break:break-word;line-height:1.5}.copy-btn,.error-block{font-family:var(--font-mono)}.copy-btn{position:absolute;top:.5rem;right:.5rem;background:var(--wire);border:none;border-radius:3px;padding:.25rem .5rem;font-size:.625rem;color:var(--muted-light);cursor:pointer;opacity:0;transition:opacity .2s var(--ease-standard);text-transform:uppercase;letter-spacing:.1em}.copy-btn:focus,.json-viewer:hover .copy-btn{opacity:1}.copy-btn:hover{color:var(--concrete);background:var(--muted)}.filter-bar{display:flex;gap:.375rem;margin-bottom:1rem}.filter-btn{font-family:var(--font-mono);font-size:.6875rem;padding:.25rem .625rem;border:var(--border-width) solid var(--concrete-dark);border-radius:3px;background:var(--surface);color:var(--muted);cursor:pointer;text-transform:uppercase;letter-spacing:.05em;transition:all .15s var(--ease-standard)}.filter-btn:hover{border-color:var(--charcoal);color:var(--charcoal)}.filter-btn--active{background:var(--charcoal);border-color:var(--charcoal);color:var(--concrete)}.node-detail{background:var(--surface);border:var(--border-width) solid var(--concrete-dark);border-radius:4px;padding:1.25rem;margin-top:1rem}.node-detail-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem}.node-detail-title{font-family:var(--font-mono);font-size:.875rem;font-weight:500}.detail-section{margin-bottom:1.5rem}.detail-section:last-child{margin-bottom:0}.detail-section-label{font-family:var(--font-mono);font-size:.65rem;text-transform:uppercase;letter-spacing:.22em;color:var(--rust);margin-bottom:.5rem;display:flex;align-items:center;gap:.5rem}.detail-section-label:before{content:"";display:block;width:1rem;height:var(--border-width);background:var(--rust)}.meta-value--link{color:var(--rust);cursor:pointer}.meta-value--link:hover{color:var(--rust-light);text-decoration:underline}.dag-node--selected rect{stroke:var(--rust)!important;stroke-width:2.5!important}.json-parse-error{font-family:var(--font-mono);font-size:.6875rem;color:var(--rust);margin-top:.25rem}.station-table tr.clickable-row{cursor:pointer}.station-table tr.clickable-row:hover td{background:var(--concrete-dark)}.page-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem}.page-header-actions{display:flex;gap:.5rem;align-items:center}.schema-pair{display:grid;grid-template-columns:1fr 1fr;grid-gap:1rem;gap:1rem}.config-grid{display:flex;flex-wrap:wrap;gap:1.5rem;margin-bottom:.5rem}.config-item{display:flex;flex-direction:column;gap:.125rem}.config-item-label{font-family:var(--font-mono);font-size:.625rem;text-transform:uppercase;letter-spacing:.15em;color:var(--muted)}.config-item-value{font-family:var(--font-mono);font-size:.875rem;color:var(--charcoal)}.workflow-layout{display:flex;gap:0;align-items:flex-start;border:var(--border-width) solid var(--concrete-dark);border-radius:4px;background:var(--surface);min-height:400px}.workflow-sidebar{width:220px;flex-shrink:0;border-right:var(--border-width) solid var(--concrete-dark);padding:.5rem 0;overflow-y:auto;max-height:calc(100vh - var(--header-height) - 10rem);position:-webkit-sticky;position:sticky;top:calc(var(--header-height) + 1.5rem)}.workflow-sidebar-label{font-family:var(--font-mono);font-size:.6rem;text-transform:uppercase;letter-spacing:.2em;color:var(--muted);padding:.375rem .75rem .5rem}.workflow-node-item{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem .75rem;background:none;cursor:pointer;font-family:var(--font-mono);font-size:.8125rem;color:var(--charcoal);text-align:left;transition:background .15s var(--ease-standard);border:none;border-left:2px solid transparent}.workflow-node-item:hover{background:var(--concrete)}.workflow-node-item--active{background:var(--concrete);border-left-color:var(--patina)}.workflow-node-item--failed{color:var(--rust)}.workflow-node-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.workflow-node-dot--running{animation:signal-pulse var(--duration-pulse) ease-out infinite}.workflow-node-name{flex:1 1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workflow-node-duration{font-size:.6875rem;color:var(--muted);flex-shrink:0}.workflow-panel{flex:1 1;min-width:0;padding:1.25rem;overflow-y:auto;max-height:calc(100vh - var(--header-height) - 10rem)}.node-detail-meta{font-family:var(--font-mono);font-size:.75rem;color:var(--muted)}@media (max-width:768px){.workflow-layout{flex-direction:column;min-height:auto}.workflow-sidebar{width:100%;max-height:none;position:static;border-right:none;border-bottom:var(--border-width) solid var(--concrete-dark);display:flex;overflow-x:auto;padding:.25rem;gap:.25rem}.workflow-sidebar-label{display:none}.workflow-node-item{white-space:nowrap;padding:.375rem .5rem;border-left:none;border-bottom:2px solid transparent;font-size:.75rem}.workflow-node-item--active{border-bottom-color:var(--patina);border-left-color:transparent}.workflow-panel{max-height:none}}.collapsible-header{display:flex;align-items:center;gap:.375rem;font-family:var(--font-mono);font-size:.75rem;color:var(--muted);cursor:pointer;background:none;border:none;padding:.375rem 0;text-transform:uppercase;letter-spacing:.1em;transition:color .15s var(--ease-standard)}.collapsible-header:hover{color:var(--charcoal)}.collapsible-chevron{font-size:.625rem;line-height:1}.collapsible-content{padding-top:.5rem}.activity-row{cursor:pointer;border-radius:2px;transition:background .15s var(--ease-standard)}.activity-row:hover{background:var(--concrete-dark)}.theme-toggle{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:4px;background:transparent;color:var(--muted);cursor:pointer;transition:color .2s var(--ease-standard),background .2s var(--ease-standard)}.theme-toggle:hover{color:var(--charcoal);background:var(--concrete-dark)}.login-page{display:flex;align-items:center;justify-content:center;min-height:100vh;background:var(--concrete)}.login-card{width:320px;background:var(--surface);border:var(--border-width) solid var(--concrete-dark);border-radius:4px;padding:2rem 1.5rem}.login-header{display:flex;align-items:center;gap:.5rem;margin-bottom:1.5rem;color:var(--charcoal)}.login-header h1{font-family:var(--font-display);font-size:1.25rem;font-weight:400}.login-field{margin-bottom:.75rem}.login-field label{display:block;font-family:var(--font-mono);font-size:.625rem;text-transform:uppercase;letter-spacing:.15em;color:var(--muted);margin-bottom:.25rem}.login-field input{width:100%;padding:.5rem .625rem;font-family:var(--font-mono);font-size:.8125rem;color:var(--charcoal);background:var(--concrete);border:var(--border-width) solid var(--concrete-dark);border-radius:3px;outline:none;transition:border-color .15s var(--ease-standard)}.login-field input:focus{border-color:var(--patina)}.login-error{font-family:var(--font-mono);font-size:.75rem;color:var(--rust);margin-bottom:.75rem}.login-btn{width:100%;justify-content:center;margin-top:.25rem}.logout-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:4px;background:transparent;color:var(--muted);cursor:pointer;transition:color .2s var(--ease-standard),background .2s var(--ease-standard)}.logout-btn:hover{color:var(--rust);background:var(--concrete-dark)}
@@ -0,0 +1 @@
1
+ self.__BUILD_MANIFEST=function(e,r,t,_){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:11,errorRate:1e-4,numBits:211,numHashes:14,bitArray:[0,0,r,1,r,r,r,r,1,e,r,e,e,e,e,r,e,e,r,r,e,r,e,e,r,r,r,r,r,e,e,r,e,e,e,r,r,r,r,e,r,e,r,e,e,r,e,r,e,e,e,r,r,r,r,r,r,r,r,e,e,e,e,r,e,r,e,r,e,r,e,r,e,r,r,e,r,e,e,r,e,r,r,r,e,e,r,e,r,e,e,e,r,e,e,e,r,e,r,r,e,e,r,e,r,r,e,r,e,e,r,e,r,r,e,e,e,r,e,r,e,e,e,e,e,e,r,e,e,e,r,e,e,e,r,e,r,r,e,e,r,r,e,r,e,e,e,r,e,r,r,r,r,r,r,e,e,r,r,e,r,r,r,e,e,e,r,r,r,r,e,r,e,e,e,e,r,e,r,r,r,e,e,e,r,r,r,r,r,e,e,r,e,e,e,r,e,e,r,r,r,e,r,e,e,r,r,r,e,e,r]},__routerFilterDynamic:{numItems:6,errorRate:1e-4,numBits:116,numHashes:14,bitArray:[r,r,r,e,r,e,r,e,e,e,r,r,r,r,e,e,e,r,r,r,r,r,e,e,e,e,r,e,e,e,r,r,e,e,r,r,e,e,e,e,e,r,e,r,e,e,r,e,e,r,r,e,r,r,r,e,r,r,r,r,r,e,r,e,r,r,e,r,e,e,r,e,r,r,e,e,r,e,e,r,e,e,e,r,e,r,r,e,r,r,e,e,r,e,r,e,r,r,r,r,e,r,e,e,r,r,r,r,e,e,e,e,e,r,e,e]},"/_error":["static/chunks/pages/_error-273a093c18b5ed0f.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4,14),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "station-kit",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "Dashboard for station-signal — inspect and control signals and broadcasts",
5
5
  "type": "module",
6
6
  "engines": {
@@ -36,6 +36,7 @@
36
36
  "test": "node --import tsx --test \"test/**/*.test.ts\""
37
37
  },
38
38
  "peerDependencies": {
39
+ "station-beacon": "workspace:*",
39
40
  "station-broadcast": "workspace:*",
40
41
  "station-signal": "workspace:*"
41
42
  },
@@ -46,6 +47,7 @@
46
47
  "next": "^15",
47
48
  "react": "^19",
48
49
  "react-dom": "^19",
50
+ "station-env": "workspace:*",
49
51
  "station-expressions": "workspace:*",
50
52
  "station-schedules": "workspace:*",
51
53
  "tsx": "^4.21.0",
@@ -58,6 +60,7 @@
58
60
  "@types/ws": "^8",
59
61
  "better-sqlite3": "^11.9.1",
60
62
  "station-adapter-sqlite": "workspace:*",
63
+ "station-beacon": "workspace:*",
61
64
  "station-broadcast": "workspace:*",
62
65
  "station-signal": "workspace:*",
63
66
  "typescript": "^5.9.3"
@@ -1,6 +1,8 @@
1
1
  import type { SignalQueueAdapter } from "station-signal";
2
2
  import type { BroadcastQueueAdapter } from "station-broadcast";
3
+ import type { BeaconStateAdapter } from "station-beacon";
3
4
  import type { ScheduleAdapter } from "station-schedules";
5
+ import type { EnvStorageAdapter } from "station-env";
4
6
  import type { ApiKeyStorageAdapter } from "../server/auth/keys.js";
5
7
  import type { LogStorageAdapter } from "../server/log-store.js";
6
8
  export interface AuthConfig {
@@ -32,11 +34,26 @@ export interface StationConfig {
32
34
  host: string;
33
35
  adapter?: SignalQueueAdapter;
34
36
  broadcastAdapter?: BroadcastQueueAdapter;
37
+ /**
38
+ * Optional beacon supervision-state adapter. When provided (or when
39
+ * `beaconsDir` is set), the dashboard supervises long-running beacons and
40
+ * exposes them under `/api/beacons`.
41
+ */
42
+ beaconAdapter?: BeaconStateAdapter;
35
43
  /**
36
44
  * Optional schedule storage adapter. When provided, runtime-editable
37
45
  * schedules are persisted here and reconciled by both runners.
38
46
  */
39
47
  scheduleAdapter?: ScheduleAdapter;
48
+ /**
49
+ * Pluggable storage backend for runtime environment variables. Defaults to a
50
+ * JSON file at `<dataDir>/station-env.json` (no native dependencies). When
51
+ * set — or by default — signals/beacons can require env vars via `.env()`,
52
+ * and variables defined here (globally or scoped to specific targets) are
53
+ * injected into runs. For multi-process deployments pass a durable adapter
54
+ * from a `station-adapter-*` package's `/env` subpath.
55
+ */
56
+ envStorage?: EnvStorageAdapter;
40
57
  /**
41
58
  * Pluggable storage backend for run logs. Defaults to a `FileLogStorage`
42
59
  * (append-only JSONL file at `<dataDir>/station-logs.jsonl`, no native
@@ -47,6 +64,7 @@ export interface StationConfig {
47
64
  logStorage?: LogStorageAdapter;
48
65
  signalsDir?: string;
49
66
  broadcastsDir?: string;
67
+ beaconsDir?: string;
50
68
  stationDir: string;
51
69
  runner: RunnerConfig;
52
70
  broadcastRunner: BroadcastRunnerConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,qBAAqB,CAAC;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,iBAAiB,CAAC,CAAC,GAAG;IAC3F,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAClD,CAAC;AAoBF,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,CA2CrE"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC;;;;OAIG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,qBAAqB,CAAC;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,iBAAiB,CAAC,CAAC,GAAG;IAC3F,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAClD,CAAC;AAoBF,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,CA8CrE"}
@@ -37,10 +37,13 @@ export function resolveConfig(input) {
37
37
  host: input.host ?? envHost ?? DEFAULTS.host,
38
38
  adapter: input.adapter,
39
39
  broadcastAdapter: input.broadcastAdapter,
40
+ beaconAdapter: input.beaconAdapter,
40
41
  scheduleAdapter: input.scheduleAdapter,
42
+ envStorage: input.envStorage,
41
43
  logStorage: input.logStorage,
42
44
  signalsDir: input.signalsDir,
43
45
  broadcastsDir: input.broadcastsDir,
46
+ beaconsDir: input.beaconsDir,
44
47
  stationDir: input.stationDir ?? DEFAULTS.stationDir,
45
48
  runner: {
46
49
  pollIntervalMs: input.runner?.pollIntervalMs ?? DEFAULTS.runner.pollIntervalMs,
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAqEA,MAAM,QAAQ,GAAkB;IAC9B,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,UAAU;IACtB,MAAM,EAAE;QACN,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;QACd,cAAc,EAAE,IAAI;KACrB;IACD,eAAe,EAAE;QACf,cAAc,EAAE,IAAI;KACrB;IACD,UAAU,EAAE,IAAI;IAChB,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,MAAM;CACjB,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,KAAwB;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAEtD,4EAA4E;IAC5E,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,GAAG;YACL,GAAG,IAAI;YACP,QAAQ,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ;YACtC,QAAQ,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ;SACvC,CAAC;IACJ,CAAC;SAAM,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QACtC,IAAI,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO,IAAI,QAAQ,CAAC,IAAI;QAC5C,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO,IAAI,QAAQ,CAAC,IAAI;QAC5C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU;QACnD,MAAM,EAAE;YACN,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC,cAAc;YAC9E,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC,aAAa;YAC3E,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW;YACrE,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC,cAAc;SAC/E;QACD,eAAe,EAAE;YACf,cAAc,EAAE,KAAK,CAAC,eAAe,EAAE,cAAc,IAAI,QAAQ,CAAC,eAAe,CAAC,cAAc;SACjG;QACD,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU;QACnD,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;QACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;QAC7C,IAAI;QACJ,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,4 +3,5 @@ export declare function defineConfig(config: StationUserConfig): StationUserConf
3
3
  export type { StationConfig, StationUserConfig, AuthConfig, DeployConfig } from "./config/schema.js";
4
4
  export { resolveConfig } from "./config/schema.js";
5
5
  export { loadConfig } from "./config/loader.js";
6
+ export { EnvStore, MemoryEnvStorage, FileEnvStorage, type EnvStorageAdapter, type EnvVar, type EnvVarPublic, type EnvTarget, } from "station-env";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAEzE;AAED,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAEzE;AAED,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,SAAS,GACf,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -3,4 +3,7 @@ export function defineConfig(config) {
3
3
  }
4
4
  export { resolveConfig } from "./config/schema.js";
5
5
  export { loadConfig } from "./config/loader.js";
6
+ // Re-export the runtime env store surface so consumers can construct custom
7
+ // storage or the store itself without a separate `station-env` import.
8
+ export { EnvStore, MemoryEnvStorage, FileEnvStorage, } from "station-env";
6
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,MAAyB;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,MAAyB;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,4EAA4E;AAC5E,uEAAuE;AACvE,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,cAAc,GAKf,MAAM,aAAa,CAAC"}
@@ -74,6 +74,8 @@ export declare class SqliteKeyStorage implements ApiKeyStorageAdapter {
74
74
  insert(record: ApiKey): void;
75
75
  findByHash(keyHash: string): ApiKey | null;
76
76
  list(): ApiKeyPublic[];
77
+ /** Last persisted lastUsed per key id, to skip per-request UPDATEs. */
78
+ private lastTouched;
77
79
  touch(id: string, lastUsedIso: string): void;
78
80
  revoke(id: string): boolean;
79
81
  close(): void;
@@ -86,15 +88,30 @@ export declare class MemoryKeyStorage implements ApiKeyStorageAdapter {
86
88
  touch(id: string, lastUsedIso: string): void;
87
89
  revoke(id: string): boolean;
88
90
  }
91
+ export interface KeyStoreOptions {
92
+ /**
93
+ * Server-side secret ("pepper") mixed into stored key hashes via HMAC.
94
+ * Defense-in-depth: a leaked key file alone can't be brute-forced or
95
+ * precomputed against without also stealing this secret. Optional — when
96
+ * omitted, keys are hashed with plain SHA-256 (legacy behavior). Existing
97
+ * plain-SHA-256 keys keep verifying after a pepper is added (see verify()).
98
+ */
99
+ pepper?: string;
100
+ }
89
101
  export declare class KeyStore {
90
102
  private storage;
103
+ private pepper?;
91
104
  /**
92
105
  * Pass an `ApiKeyStorageAdapter` for any backend. The string overload is
93
106
  * retained for backwards compatibility — it constructs a FileKeyStorage
94
107
  * at the given path. (Previously this returned a SqliteKeyStorage; SQLite
95
108
  * is now opt-in to avoid native build dependencies.)
96
109
  */
97
- constructor(storageOrPath: ApiKeyStorageAdapter | string);
110
+ constructor(storageOrPath: ApiKeyStorageAdapter | string, options?: KeyStoreOptions);
111
+ /** Peppered hash for new keys — HMAC-SHA256 when a pepper is set, else SHA-256. */
112
+ private hashKey;
113
+ /** Unpeppered SHA-256 — used to verify keys stored before a pepper was configured. */
114
+ private legacyHashKey;
98
115
  /** Generate a new API key. Returns the full key (only shown once) and the stored record. */
99
116
  create(name: string, scopes?: string[]): Promise<{
100
117
  key: string;
@@ -1 +1 @@
1
- {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/server/auth/keys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/server/auth/keys.ts"],"names":[],"mappings":"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"}
@@ -93,8 +93,15 @@ export class FileKeyStorage {
93
93
  const r = this.records.get(id);
94
94
  if (!r)
95
95
  return;
96
+ const prev = r.lastUsed ? Date.parse(r.lastUsed) : 0;
96
97
  r.lastUsed = lastUsedIso;
97
- this.flush();
98
+ // lastUsed is advisory. flush() rewrites and fsyncs the whole file
99
+ // synchronously — doing that on every authenticated request stalls the
100
+ // event loop, so only persist when the value moves by at least a minute.
101
+ // Reads stay fresh because list() serves from memory.
102
+ if (Date.parse(lastUsedIso) - prev >= 60_000) {
103
+ this.flush();
104
+ }
98
105
  }
99
106
  revoke(id) {
100
107
  const r = this.records.get(id);
@@ -200,7 +207,15 @@ export class SqliteKeyStorage {
200
207
  revoked: Boolean(row.revoked),
201
208
  }));
202
209
  }
210
+ /** Last persisted lastUsed per key id, to skip per-request UPDATEs. */
211
+ lastTouched = new Map();
203
212
  touch(id, lastUsedIso) {
213
+ // lastUsed is advisory — throttle writes to once a minute per key.
214
+ const prev = this.lastTouched.get(id) ?? 0;
215
+ const next = Date.parse(lastUsedIso);
216
+ if (next - prev < 60_000)
217
+ return;
218
+ this.lastTouched.set(id, next);
204
219
  this.db.prepare(`UPDATE ${this.table} SET last_used = ? WHERE id = ?`).run(lastUsedIso, id);
205
220
  }
206
221
  revoke(id) {
@@ -258,16 +273,16 @@ export class MemoryKeyStorage {
258
273
  return true;
259
274
  }
260
275
  }
261
- // ─── KeyStore — owns crypto, delegates persistence ──────────────────
262
276
  export class KeyStore {
263
277
  storage;
278
+ pepper;
264
279
  /**
265
280
  * Pass an `ApiKeyStorageAdapter` for any backend. The string overload is
266
281
  * retained for backwards compatibility — it constructs a FileKeyStorage
267
282
  * at the given path. (Previously this returned a SqliteKeyStorage; SQLite
268
283
  * is now opt-in to avoid native build dependencies.)
269
284
  */
270
- constructor(storageOrPath) {
285
+ constructor(storageOrPath, options) {
271
286
  if (typeof storageOrPath === "string") {
272
287
  const filePath = storageOrPath.endsWith(".db")
273
288
  ? storageOrPath.replace(/\.db$/, ".json")
@@ -277,12 +292,25 @@ export class KeyStore {
277
292
  else {
278
293
  this.storage = storageOrPath;
279
294
  }
295
+ if (options?.pepper)
296
+ this.pepper = Buffer.from(options.pepper, "utf8");
297
+ }
298
+ /** Peppered hash for new keys — HMAC-SHA256 when a pepper is set, else SHA-256. */
299
+ hashKey(rawKey) {
300
+ if (this.pepper) {
301
+ return crypto.createHmac("sha256", this.pepper).update(rawKey).digest("hex");
302
+ }
303
+ return crypto.createHash("sha256").update(rawKey).digest("hex");
304
+ }
305
+ /** Unpeppered SHA-256 — used to verify keys stored before a pepper was configured. */
306
+ legacyHashKey(rawKey) {
307
+ return crypto.createHash("sha256").update(rawKey).digest("hex");
280
308
  }
281
309
  /** Generate a new API key. Returns the full key (only shown once) and the stored record. */
282
310
  async create(name, scopes = ["trigger", "read"]) {
283
311
  const id = crypto.randomUUID();
284
312
  const rawKey = `sk_live_${crypto.randomBytes(16).toString("hex")}`;
285
- const keyHash = crypto.createHash("sha256").update(rawKey).digest("hex");
313
+ const keyHash = this.hashKey(rawKey);
286
314
  const keyPrefix = rawKey.slice(0, 12);
287
315
  const createdAt = new Date().toISOString();
288
316
  const record = {
@@ -294,8 +322,12 @@ export class KeyStore {
294
322
  }
295
323
  /** Verify an API key. Returns the key record if valid, null otherwise. */
296
324
  async verify(rawKey) {
297
- const keyHash = crypto.createHash("sha256").update(rawKey).digest("hex");
298
- const record = await this.storage.findByHash(keyHash);
325
+ let record = await this.storage.findByHash(this.hashKey(rawKey));
326
+ // Fall back to the unpeppered hash for keys created before the pepper was
327
+ // configured, so enabling a pepper doesn't invalidate existing keys.
328
+ if (!record && this.pepper) {
329
+ record = await this.storage.findByHash(this.legacyHashKey(rawKey));
330
+ }
299
331
  if (!record)
300
332
  return null;
301
333
  if (record.revoked)
@@ -1 +1 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/server/auth/keys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/server/auth/keys.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,EAEV,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCpC;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,cAAc;IACjB,QAAQ,CAAS;IACjB,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,YAAY,OAA8B;QACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,IAAI;QACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;YACzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,KAAK,MAAM,CAAC,IAAI,IAAI;oBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAEO,KAAK;QACX,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,MAAM,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE,oEAAoE;QACpE,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACpB,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QACD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,sEAAsE;QACtE,sEAAsE;QACtE,0DAA0D;QAC1D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;YACpD,IAAI,CAAC;gBACH,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;oBAAS,CAAC;gBACT,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;YAC/D,uDAAuD;QACzD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;gBAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;aACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACtD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,EAAU,EAAE,WAAmB;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,QAAQ,GAAG,WAAW,CAAC;QACzB,mEAAmE;QACnE,uEAAuE;QACvE,yEAAyE;QACzE,sDAAsD;QACtD,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACrB,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAcD,IAAI,mBAAmB,GAA+B,IAAI,CAAC;AAE3D,SAAS,iBAAiB;IACxB,IAAI,mBAAmB;QAAE,OAAO,mBAAmB,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,mBAAmB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAClD,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,mEAAmE;YACjE,2CAA2C;YAC3C,gCAAgC;YAChC,+DAA+D;YAC/D,qBAAqB,MAAM,EAAE,CAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAgB;IAC3B,8DAA8D;IACtD,EAAE,CAAM;IACR,KAAK,CAAS;IAEtB,YAAY,OAAgC;QAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;QAClD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;QACrC,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;mCACkB,IAAI,CAAC,KAAK;;;;;;;;;;;KAWxC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;oBACA,IAAI,CAAC,KAAK;;;;KAIzB,CAAC,CAAC,GAAG,CAAC;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,OAAO;YACxB,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;YACrC,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,UAAU,EAAE,MAAM,CAAC,SAAS;YAC5B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC;uBACQ,IAAI,CAAC,KAAK,qBAAqB,CAAC;aAChD,GAAG,CAAC,OAAO,CAAwC,CAAC;QACvD,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAED,IAAI;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC;uBACQ,IAAI,CAAC,KAAK,2BAA2B,CAAC;aACtD,GAAG,EAA+B,CAAC;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,IAAI,EAAE,GAAG,CAAC,IAAc;YACxB,SAAS,EAAE,GAAG,CAAC,UAAoB;YACnC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAgB,CAAC;YACxC,SAAS,EAAE,GAAG,CAAC,UAAoB;YACnC,QAAQ,EAAG,GAAG,CAAC,SAA2B,IAAI,IAAI;YAClD,SAAS,EAAG,GAAG,CAAC,UAA4B,IAAI,IAAI;YACpD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,uEAAuE;IAC/D,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEhD,KAAK,CAAC,EAAU,EAAE,WAAmB;QACnC,mEAAmE;QACnE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM;YAAE,OAAO;QACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,KAAK,iCAAiC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,KAAK,+BAA+B,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5F,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AAED,SAAS,WAAW,CAAC,GAA4B;IAC/C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,IAAI,EAAE,GAAG,CAAC,IAAc;QACxB,OAAO,EAAE,GAAG,CAAC,QAAkB;QAC/B,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAgB,CAAC;QACxC,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,QAAQ,EAAG,GAAG,CAAC,SAA2B,IAAI,IAAI;QAClD,SAAS,EAAG,GAAG,CAAC,UAA4B,IAAI,IAAI;QACpD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,uEAAuE;AAEvE,MAAM,OAAO,gBAAgB;IACnB,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;gBAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;aACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;aACtD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,EAAU,EAAE,WAAmB;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC;YAAE,CAAC,CAAC,QAAQ,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACrB,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAeD,MAAM,OAAO,QAAQ;IACX,OAAO,CAAuB;IAC9B,MAAM,CAAU;IAExB;;;;;OAKG;IACH,YAAY,aAA4C,EAAE,OAAyB;QACjF,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC5C,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;gBACzC,CAAC,CAAC,aAAa,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,EAAE,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,mFAAmF;IAC3E,OAAO,CAAC,MAAc;QAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,sFAAsF;IAC9E,aAAa,CAAC,MAAc;QAClC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,SAAmB,CAAC,SAAS,EAAE,MAAM,CAAC;QAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,WAAW,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAW;YACrB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS;YAC/C,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;SAChD,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjC,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,0EAA0E;QAC1E,qEAAqE;QACrE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAChC,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QAE7E,wEAAwE;QACxE,uEAAuE;QACvE,2CAA2C;QAC3C,OAAO,CAAC,OAAO,EAAE;aACd,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;aACnE,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEnB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,0BAA0B;IAC1B,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACrD,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/server/auth/session.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AASD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAKhE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAchF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAOpG"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/server/auth/session.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAqCD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAKhE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAchF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAMpG"}
@@ -1,15 +1,39 @@
1
1
  import crypto from "node:crypto";
2
2
  const SESSION_TTL_MS = 86_400_000; // 24 hours
3
- /** HMAC-sign a token. The secret is derived from the password. */
4
- function sign(payload, secret) {
5
- const hmac = crypto.createHmac("sha256", secret);
3
+ /**
4
+ * Derive the HMAC signing key from the password via HKDF instead of using
5
+ * the cleartext password as the key directly — issued cookies should not be
6
+ * HMACs keyed with the literal admin credential. Cached because HKDF per
7
+ * request would be wasted CPU.
8
+ */
9
+ const secretCache = new Map();
10
+ function sessionSecret(config) {
11
+ let secret = secretCache.get(config.password);
12
+ if (!secret) {
13
+ secret = Buffer.from(crypto.hkdfSync("sha256", config.password, "station-kit", "session-token-v1", 32));
14
+ secretCache.set(config.password, secret);
15
+ }
16
+ return secret;
17
+ }
18
+ function sign(payload, config) {
19
+ const hmac = crypto.createHmac("sha256", sessionSecret(config));
6
20
  hmac.update(payload);
7
21
  return hmac.digest("hex");
8
22
  }
23
+ /**
24
+ * Timing-safe string comparison that doesn't leak length: both inputs are
25
+ * hashed to a fixed size before `timingSafeEqual` (which requires equal
26
+ * lengths and would otherwise short-circuit on a length check).
27
+ */
28
+ function safeEqual(a, b) {
29
+ const ha = crypto.createHash("sha256").update(a).digest();
30
+ const hb = crypto.createHash("sha256").update(b).digest();
31
+ return crypto.timingSafeEqual(ha, hb);
32
+ }
9
33
  export function createSessionToken(config) {
10
34
  const exp = Date.now() + (config.sessionTtlMs ?? SESSION_TTL_MS);
11
35
  const payload = `${config.username}:${exp}`;
12
- const signature = sign(payload, config.password);
36
+ const signature = sign(payload, config);
13
37
  return Buffer.from(`${payload}:${signature}`).toString("base64url");
14
38
  }
15
39
  export function verifySessionToken(token, config) {
@@ -24,19 +48,18 @@ export function verifySessionToken(token, config) {
24
48
  return false;
25
49
  if (username !== config.username)
26
50
  return false;
27
- const expected = sign(`${username}:${expStr}`, config.password);
28
- return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
51
+ const expected = sign(`${username}:${expStr}`, config);
52
+ return safeEqual(sig, expected);
29
53
  }
30
54
  catch {
31
55
  return false;
32
56
  }
33
57
  }
34
58
  export function verifyCredentials(username, password, config) {
35
- // Use timing-safe comparison to prevent timing attacks
36
- const userMatch = username.length === config.username.length &&
37
- crypto.timingSafeEqual(Buffer.from(username), Buffer.from(config.username));
38
- const passMatch = password.length === config.password.length &&
39
- crypto.timingSafeEqual(Buffer.from(password), Buffer.from(config.password));
59
+ // Evaluate both comparisons unconditionally so a valid username isn't
60
+ // distinguishable from an invalid one by response time.
61
+ const userMatch = safeEqual(username, config.username);
62
+ const passMatch = safeEqual(password, config.password);
40
63
  return userMatch && passMatch;
41
64
  }
42
65
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/server/auth/session.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,WAAW;AAQ9C,kEAAkE;AAClE,SAAS,IAAI,CAAC,OAAe,EAAE,MAAc;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,MAAqB;IACrE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,QAAQ,KAAK,MAAM,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,QAAQ,IAAI,MAAM,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,QAAgB,EAAE,MAAqB;IACzF,uDAAuD;IACvD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM;QAC1D,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM;QAC1D,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9E,OAAO,SAAS,IAAI,SAAS,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/server/auth/session.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAWzD,OAAO,EAAE,QAAQ,EAAkB,MAAM,gBAAgB,CAAC;AAiB1D,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,MAAM,EACN,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAiWnH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAYzD,OAAO,EAAE,QAAQ,EAAkB,MAAM,gBAAgB,CAAC;AAkB1D,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,MAAM,EACN,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAsbnH"}