aicodeman 0.3.6 → 0.3.7

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 (93) hide show
  1. package/dist/ai-checker-base.d.ts.map +1 -1
  2. package/dist/ai-checker-base.js +2 -2
  3. package/dist/ai-checker-base.js.map +1 -1
  4. package/dist/ai-idle-checker.d.ts.map +1 -1
  5. package/dist/ai-idle-checker.js +5 -5
  6. package/dist/ai-idle-checker.js.map +1 -1
  7. package/dist/ai-plan-checker.d.ts.map +1 -1
  8. package/dist/ai-plan-checker.js +5 -5
  9. package/dist/ai-plan-checker.js.map +1 -1
  10. package/dist/config/ai-defaults.d.ts +20 -4
  11. package/dist/config/ai-defaults.d.ts.map +1 -1
  12. package/dist/config/ai-defaults.js +32 -4
  13. package/dist/config/ai-defaults.js.map +1 -1
  14. package/dist/config/server-timing.d.ts +6 -0
  15. package/dist/config/server-timing.d.ts.map +1 -1
  16. package/dist/config/server-timing.js +9 -0
  17. package/dist/config/server-timing.js.map +1 -1
  18. package/dist/file-stream-manager.d.ts.map +1 -1
  19. package/dist/file-stream-manager.js +3 -2
  20. package/dist/file-stream-manager.js.map +1 -1
  21. package/dist/ralph-config.d.ts.map +1 -1
  22. package/dist/ralph-config.js +3 -4
  23. package/dist/ralph-config.js.map +1 -1
  24. package/dist/ralph-stall-detector.d.ts.map +1 -1
  25. package/dist/ralph-stall-detector.js +2 -1
  26. package/dist/ralph-stall-detector.js.map +1 -1
  27. package/dist/ralph-tracker.d.ts.map +1 -1
  28. package/dist/ralph-tracker.js +17 -22
  29. package/dist/ralph-tracker.js.map +1 -1
  30. package/dist/respawn-controller.d.ts.map +1 -1
  31. package/dist/respawn-controller.js +5 -5
  32. package/dist/respawn-controller.js.map +1 -1
  33. package/dist/run-summary.d.ts.map +1 -1
  34. package/dist/run-summary.js +2 -1
  35. package/dist/run-summary.js.map +1 -1
  36. package/dist/session.d.ts.map +1 -1
  37. package/dist/session.js +3 -6
  38. package/dist/session.js.map +1 -1
  39. package/dist/subagent-watcher.d.ts.map +1 -1
  40. package/dist/subagent-watcher.js +2 -1
  41. package/dist/subagent-watcher.js.map +1 -1
  42. package/dist/task-tracker.d.ts.map +1 -1
  43. package/dist/task-tracker.js +2 -1
  44. package/dist/task-tracker.js.map +1 -1
  45. package/dist/types/plan.d.ts +2 -4
  46. package/dist/types/plan.d.ts.map +1 -1
  47. package/dist/types/plan.js +1 -1
  48. package/dist/utils/index.d.ts +2 -2
  49. package/dist/utils/index.d.ts.map +1 -1
  50. package/dist/utils/index.js +2 -2
  51. package/dist/utils/index.js.map +1 -1
  52. package/dist/utils/regex-patterns.d.ts +5 -0
  53. package/dist/utils/regex-patterns.d.ts.map +1 -1
  54. package/dist/utils/regex-patterns.js +11 -0
  55. package/dist/utils/regex-patterns.js.map +1 -1
  56. package/dist/utils/token-validation.d.ts +1 -27
  57. package/dist/utils/token-validation.d.ts.map +1 -1
  58. package/dist/utils/token-validation.js +1 -47
  59. package/dist/utils/token-validation.js.map +1 -1
  60. package/dist/web/public/api-client.js.gz +0 -0
  61. package/dist/web/public/app.js +26 -26
  62. package/dist/web/public/app.js.br +0 -0
  63. package/dist/web/public/app.js.gz +0 -0
  64. package/dist/web/public/constants.js +2 -2
  65. package/dist/web/public/constants.js.br +0 -0
  66. package/dist/web/public/constants.js.gz +0 -0
  67. package/dist/web/public/index.html.gz +0 -0
  68. package/dist/web/public/keyboard-accessory.js.gz +0 -0
  69. package/dist/web/public/mobile-handlers.js.gz +0 -0
  70. package/dist/web/public/mobile.css.gz +0 -0
  71. package/dist/web/public/notification-manager.js.gz +0 -0
  72. package/dist/web/public/ralph-wizard.js.gz +0 -0
  73. package/dist/web/public/styles.css.gz +0 -0
  74. package/dist/web/public/subagent-windows.js +118 -18
  75. package/dist/web/public/subagent-windows.js.br +0 -0
  76. package/dist/web/public/subagent-windows.js.gz +0 -0
  77. package/dist/web/public/sw.js.gz +0 -0
  78. package/dist/web/public/upload.html.gz +0 -0
  79. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  80. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  81. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  82. package/dist/web/public/vendor/xterm-zerolag-input.js.gz +0 -0
  83. package/dist/web/public/vendor/xterm.css.gz +0 -0
  84. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  85. package/dist/web/public/voice-input.js.gz +0 -0
  86. package/dist/web/routes/respawn-routes.d.ts.map +1 -1
  87. package/dist/web/routes/respawn-routes.js +5 -5
  88. package/dist/web/routes/respawn-routes.js.map +1 -1
  89. package/dist/web/server.d.ts +10 -0
  90. package/dist/web/server.d.ts.map +1 -1
  91. package/dist/web/server.js +66 -14
  92. package/dist/web/server.js.map +1 -1
  93. package/package.json +1 -1
Binary file
Binary file
@@ -52,8 +52,8 @@ const TITLE_FLASH_INTERVAL_MS = 1500; // Title flash rate
52
52
  const BROWSER_NOTIF_RATE_LIMIT_MS = 3000; // Rate limit for browser notifications
53
53
  const AUTO_CLOSE_NOTIFICATION_MS = 8000; // Auto-close browser notifications
54
54
  const THROTTLE_DELAY_MS = 100; // General UI throttle delay
55
- const TERMINAL_CHUNK_SIZE = 32 * 1024; // 32KB chunks for terminal data (smaller to avoid WebGL GPU stalls)
56
- const TERMINAL_TAIL_SIZE = 256 * 1024; // 256KB tail for initial load
55
+ const TERMINAL_CHUNK_SIZE = 32 * 1024; // 32KB chunks for terminal buffer loading
56
+ const TERMINAL_TAIL_SIZE = 128 * 1024; // 128KB tail for initial load
57
57
  const SYNC_WAIT_TIMEOUT_MS = 50; // Wait timeout for terminal sync
58
58
  const STATS_POLLING_INTERVAL_MS = 2000; // System stats polling
59
59
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -121,7 +121,7 @@ Object.assign(CodemanApp.prototype, {
121
121
  if (!windowData.minimized) {
122
122
  openWindows.push({
123
123
  agentId,
124
- position: windowData.position || null
124
+ position: windowData.position || null,
125
125
  });
126
126
  }
127
127
  }
@@ -163,8 +163,7 @@ Object.assign(CodemanApp.prototype, {
163
163
  // Use the PERSISTENT parent map (THE source of truth)
164
164
  // Fall back to saved sessionId only if it exists in current sessions
165
165
  const parentFromMap = this.subagentParentMap.get(agentId);
166
- const correctSessionId = parentFromMap ||
167
- (this.sessions.has(savedSessionId) ? savedSessionId : null);
166
+ const correctSessionId = parentFromMap || (this.sessions.has(savedSessionId) ? savedSessionId : null);
168
167
 
169
168
  if (correctSessionId) {
170
169
  // Ensure the parent map has this association
@@ -184,7 +183,7 @@ Object.assign(CodemanApp.prototype, {
184
183
  // Restore open windows (for recent, non-completed agents only)
185
184
  const now = Date.now();
186
185
  const maxAgeMs = 10 * 60 * 1000; // 10 minutes - don't restore windows for old agents
187
- for (const { agentId, position } of (states.open || [])) {
186
+ for (const { agentId, position } of states.open || []) {
188
187
  const agent = this.subagents.get(agentId);
189
188
  // Only restore window if agent exists, is recent, and is still active/idle
190
189
  const agentAge = agent?.startedAt ? now - agent.startedAt : Infinity;
@@ -458,6 +457,83 @@ Object.assign(CodemanApp.prototype, {
458
457
  }
459
458
  },
460
459
 
460
+ // ═══════════════════════════════════════════════════════════════
461
+ // Lazy Terminal Lifecycle
462
+ // ═══════════════════════════════════════════════════════════════
463
+ //
464
+ // Teammate terminal windows use xterm.js Terminal instances that consume
465
+ // ~75KB of DOM memory each. With 50 agents minimized, that's ~3.75MB of
466
+ // invisible terminals. To avoid this, we dispose the Terminal when a
467
+ // window is minimized and lazily re-create it when restored.
468
+ //
469
+ // Flow:
470
+ // minimize → _disposeTeammateTerminalForMinimize() → sets _lazyTerminal flag
471
+ // restore → _restoreTeammateTerminalFromLazy() → re-creates Terminal
472
+ // create (hidden/minimized) → skip initTeammateTerminal, set _lazyTerminal
473
+ //
474
+ // The tmux pane buffer is re-fetched from the API on restore. Regular
475
+ // (non-teammate) subagent windows use activity HTML and are unaffected
476
+ // by this optimization.
477
+
478
+ /**
479
+ * Dispose a teammate terminal when its window is minimized.
480
+ * Saves pane metadata so the terminal can be re-created on restore.
481
+ * No-op if the window has no teammate terminal.
482
+ */
483
+ _disposeTeammateTerminalForMinimize(agentId) {
484
+ const termData = this.teammateTerminals.get(agentId);
485
+ if (!termData) return; // Not a teammate terminal window
486
+
487
+ const windowData = this.subagentWindows.get(agentId);
488
+
489
+ // Save pane metadata needed to re-create the terminal on restore
490
+ if (windowData) {
491
+ windowData._lazyTerminal = true;
492
+ windowData._lazyPaneTarget = termData.paneTarget;
493
+ windowData._lazySessionId = termData.sessionId;
494
+ }
495
+
496
+ // Dispose the resize observer
497
+ if (termData.resizeObserver) {
498
+ termData.resizeObserver.disconnect();
499
+ }
500
+
501
+ // Dispose the xterm.js Terminal instance (frees DOM nodes and internal buffers)
502
+ if (termData.terminal) {
503
+ try {
504
+ termData.terminal.dispose();
505
+ } catch {}
506
+ }
507
+
508
+ // Remove from teammateTerminals map so renderSubagentWindowContent won't skip this window
509
+ // (the activity HTML can serve as a lightweight placeholder while minimized)
510
+ this.teammateTerminals.delete(agentId);
511
+ },
512
+
513
+ /**
514
+ * Re-create a teammate terminal when its window is restored from minimized state.
515
+ * Fetches the current pane buffer from the API (tmux is the source of truth).
516
+ * No-op if the window doesn't have the _lazyTerminal flag.
517
+ */
518
+ _restoreTeammateTerminalFromLazy(agentId) {
519
+ const windowData = this.subagentWindows.get(agentId);
520
+ if (!windowData || !windowData._lazyTerminal) return;
521
+
522
+ const paneTarget = windowData._lazyPaneTarget;
523
+ const sessionId = windowData._lazySessionId;
524
+
525
+ // Clear lazy state
526
+ windowData._lazyTerminal = false;
527
+ windowData._lazyPaneTarget = null;
528
+ windowData._lazySessionId = null;
529
+
530
+ if (!paneTarget || !sessionId) return;
531
+
532
+ // Re-create the terminal using the same initTeammateTerminal flow
533
+ const paneInfo = { paneTarget, sessionId };
534
+ this.initTeammateTerminal(agentId, paneInfo, windowData.element);
535
+ },
536
+
461
537
  // ═══════════════════════════════════════════════════════════════
462
538
  // Subagent Floating Windows
463
539
  // ═══════════════════════════════════════════════════════════════
@@ -495,7 +571,7 @@ Object.assign(CodemanApp.prototype, {
495
571
  // Only open windows for agents that belong to a Codeman-managed session tab.
496
572
  // Agents from external Claude sessions (not tracked by Codeman) should not pop up.
497
573
  if (agent.sessionId) {
498
- const hasMatchingTab = Array.from(this.sessions.values()).some(s => s.claudeSessionId === agent.sessionId);
574
+ const hasMatchingTab = Array.from(this.sessions.values()).some((s) => s.claudeSessionId === agent.sessionId);
499
575
  if (!hasMatchingTab) return;
500
576
  }
501
577
 
@@ -600,9 +676,7 @@ Object.assign(CodemanApp.prototype, {
600
676
  }
601
677
 
602
678
  // Get parent TAB element for spawn animation
603
- const parentTab = parentSessionId
604
- ? document.querySelector(`.session-tab[data-id="${parentSessionId}"]`)
605
- : null;
679
+ const parentTab = parentSessionId ? document.querySelector(`.session-tab[data-id="${parentSessionId}"]`) : null;
606
680
 
607
681
  // Create window element
608
682
  const win = document.createElement('div');
@@ -611,17 +685,19 @@ Object.assign(CodemanApp.prototype, {
611
685
  win.style.zIndex = ++this.subagentWindowZIndex;
612
686
 
613
687
  // Build parent header if we have parent info
614
- const parentHeader = parentSessionId && parentSessionName
615
- ? `<div class="subagent-window-parent" data-parent-session="${parentSessionId}">
688
+ const parentHeader =
689
+ parentSessionId && parentSessionName
690
+ ? `<div class="subagent-window-parent" data-parent-session="${parentSessionId}">
616
691
  <span class="parent-label">from</span>
617
692
  <span class="parent-name" onclick="app.selectSession('${escapeHtml(parentSessionId)}')">${escapeHtml(parentSessionName)}</span>
618
693
  </div>`
619
- : '';
694
+ : '';
620
695
 
621
696
  const teammateInfo = this.getTeammateInfo(agent);
622
- const windowTitle = teammateInfo ? teammateInfo.name : (agent.description || agentId.substring(0, 7));
697
+ const windowTitle = teammateInfo ? teammateInfo.name : agent.description || agentId.substring(0, 7);
623
698
  const maxTitleLen = isMobile ? 30 : 50;
624
- const truncatedTitle = windowTitle.length > maxTitleLen ? windowTitle.substring(0, maxTitleLen) + '...' : windowTitle;
699
+ const truncatedTitle =
700
+ windowTitle.length > maxTitleLen ? windowTitle.substring(0, maxTitleLen) + '...' : windowTitle;
625
701
  const modelBadge = agent.modelShort
626
702
  ? `<span class="subagent-model-badge ${agent.modelShort}">${agent.modelShort}</span>`
627
703
  : '';
@@ -695,7 +771,18 @@ Object.assign(CodemanApp.prototype, {
695
771
  // Render content — check if this teammate has a tmux pane
696
772
  const paneInfo = teammateInfo ? this.teammatePanesByName.get(teammateInfo.name) : null;
697
773
  if (paneInfo) {
698
- this.initTeammateTerminal(agentId, paneInfo, win);
774
+ if (shouldHide) {
775
+ // Window starts hidden — defer terminal creation until visible (lazy init).
776
+ // Saves ~75KB of DOM memory per hidden teammate terminal window.
777
+ const windowEntry = this.subagentWindows.get(agentId);
778
+ if (windowEntry) {
779
+ windowEntry._lazyTerminal = true;
780
+ windowEntry._lazyPaneTarget = paneInfo.paneTarget;
781
+ windowEntry._lazySessionId = paneInfo.sessionId;
782
+ }
783
+ } else {
784
+ this.initTeammateTerminal(agentId, paneInfo, win);
785
+ }
699
786
  } else {
700
787
  this.renderSubagentWindowContent(agentId);
701
788
  }
@@ -755,6 +842,10 @@ Object.assign(CodemanApp.prototype, {
755
842
  this.setAgentParentSessionId(agentId, parentSessionId);
756
843
  }
757
844
 
845
+ // Dispose teammate terminal on minimize to free DOM/memory (~75KB per instance).
846
+ // The terminal will be lazily re-created on restore via initTeammateTerminal().
847
+ this._disposeTeammateTerminalForMinimize(agentId);
848
+
758
849
  // Always minimize to tab
759
850
  windowData.element.style.display = 'none';
760
851
  windowData.minimized = true;
@@ -829,7 +920,9 @@ Object.assign(CodemanApp.prototype, {
829
920
  for (const [, termData] of this.teammateTerminals) {
830
921
  if (termData.resizeObserver) termData.resizeObserver.disconnect();
831
922
  if (termData.terminal) {
832
- try { termData.terminal.dispose(); } catch {}
923
+ try {
924
+ termData.terminal.dispose();
925
+ } catch {}
833
926
  }
834
927
  }
835
928
  this.teammateTerminals.clear();
@@ -959,6 +1052,13 @@ Object.assign(CodemanApp.prototype, {
959
1052
  windowData.hidden = false;
960
1053
  }
961
1054
  windowData.minimized = false;
1055
+
1056
+ // Lazily re-create teammate terminal if it was disposed on minimize.
1057
+ // Only re-create when the window is actually becoming visible.
1058
+ if (shouldShow && windowData._lazyTerminal) {
1059
+ this._restoreTeammateTerminalFromLazy(agentId);
1060
+ }
1061
+
962
1062
  this.updateConnectionLines();
963
1063
  // Restack all visible mobile windows so restored ones don't overlap
964
1064
  this.relayoutMobileSubagentWindows();
@@ -1067,7 +1167,7 @@ Object.assign(CodemanApp.prototype, {
1067
1167
  if (!dropdown || dropdown.classList.contains('open')) return;
1068
1168
 
1069
1169
  // Close other dropdowns first
1070
- document.querySelectorAll('.subagent-dropdown.open').forEach(d => {
1170
+ document.querySelectorAll('.subagent-dropdown.open').forEach((d) => {
1071
1171
  d.classList.remove('open', 'pinned');
1072
1172
  if (d.parentElement === document.body && d._originalParent) {
1073
1173
  d._originalParent.appendChild(d);
@@ -1089,8 +1189,8 @@ Object.assign(CodemanApp.prototype, {
1089
1189
  // Schedule hide after delay (allows moving mouse to dropdown)
1090
1190
  scheduleHideSubagentDropdown(badgeEl) {
1091
1191
  this._subagentHideTimeout = setTimeout(() => {
1092
- const dropdown = badgeEl?.querySelector?.('.subagent-dropdown') ||
1093
- document.querySelector('.subagent-dropdown.open');
1192
+ const dropdown =
1193
+ badgeEl?.querySelector?.('.subagent-dropdown') || document.querySelector('.subagent-dropdown.open');
1094
1194
  if (dropdown && !dropdown.classList.contains('pinned')) {
1095
1195
  dropdown.classList.remove('open');
1096
1196
  if (dropdown._originalParent) {
Binary file
Binary file
Binary file
Binary file
@@ -1 +1 @@
1
- {"version":3,"file":"respawn-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/respawn-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAapG,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAClE,IAAI,CAmTN"}
1
+ {"version":3,"file":"respawn-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/respawn-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAqBpG,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAClE,IAAI,CAuTN"}
@@ -8,7 +8,7 @@ import { RespawnConfigSchema, InteractiveRespawnSchema, RespawnEnableSchema } fr
8
8
  import { SseEvent } from '../sse-events.js';
9
9
  import { findSessionOrFail, autoConfigureRalph } from '../route-helpers.js';
10
10
  import { getLifecycleLog } from '../../session-lifecycle-log.js';
11
- import { AI_CHECK_MODEL, AI_IDLE_CHECK_MAX_CONTEXT, AI_PLAN_CHECK_MAX_CONTEXT } from '../../config/ai-defaults.js';
11
+ import { AI_CHECK_MODEL, AI_IDLE_CHECK_MAX_CONTEXT, AI_PLAN_CHECK_MAX_CONTEXT, AI_IDLE_CHECK_TIMEOUT_MS, AI_IDLE_CHECK_COOLDOWN_MS, AI_PLAN_CHECK_TIMEOUT_MS, AI_PLAN_CHECK_COOLDOWN_MS, } from '../../config/ai-defaults.js';
12
12
  /** No-op EventPort used to suppress broadcasts during pre-start ralph configuration. */
13
13
  const noopEventPort = {
14
14
  broadcast: () => { },
@@ -147,13 +147,13 @@ export function registerRespawnRoutes(app, ctx) {
147
147
  aiIdleCheckEnabled: config.aiIdleCheckEnabled ?? currentConfig?.aiIdleCheckEnabled ?? true,
148
148
  aiIdleCheckModel: config.aiIdleCheckModel ?? currentConfig?.aiIdleCheckModel ?? AI_CHECK_MODEL,
149
149
  aiIdleCheckMaxContext: config.aiIdleCheckMaxContext ?? currentConfig?.aiIdleCheckMaxContext ?? AI_IDLE_CHECK_MAX_CONTEXT,
150
- aiIdleCheckTimeoutMs: config.aiIdleCheckTimeoutMs ?? currentConfig?.aiIdleCheckTimeoutMs ?? 90000,
151
- aiIdleCheckCooldownMs: config.aiIdleCheckCooldownMs ?? currentConfig?.aiIdleCheckCooldownMs ?? 180000,
150
+ aiIdleCheckTimeoutMs: config.aiIdleCheckTimeoutMs ?? currentConfig?.aiIdleCheckTimeoutMs ?? AI_IDLE_CHECK_TIMEOUT_MS,
151
+ aiIdleCheckCooldownMs: config.aiIdleCheckCooldownMs ?? currentConfig?.aiIdleCheckCooldownMs ?? AI_IDLE_CHECK_COOLDOWN_MS,
152
152
  aiPlanCheckEnabled: config.aiPlanCheckEnabled ?? currentConfig?.aiPlanCheckEnabled ?? true,
153
153
  aiPlanCheckModel: config.aiPlanCheckModel ?? currentConfig?.aiPlanCheckModel ?? AI_CHECK_MODEL,
154
154
  aiPlanCheckMaxContext: config.aiPlanCheckMaxContext ?? currentConfig?.aiPlanCheckMaxContext ?? AI_PLAN_CHECK_MAX_CONTEXT,
155
- aiPlanCheckTimeoutMs: config.aiPlanCheckTimeoutMs ?? currentConfig?.aiPlanCheckTimeoutMs ?? 60000,
156
- aiPlanCheckCooldownMs: config.aiPlanCheckCooldownMs ?? currentConfig?.aiPlanCheckCooldownMs ?? 30000,
155
+ aiPlanCheckTimeoutMs: config.aiPlanCheckTimeoutMs ?? currentConfig?.aiPlanCheckTimeoutMs ?? AI_PLAN_CHECK_TIMEOUT_MS,
156
+ aiPlanCheckCooldownMs: config.aiPlanCheckCooldownMs ?? currentConfig?.aiPlanCheckCooldownMs ?? AI_PLAN_CHECK_COOLDOWN_MS,
157
157
  durationMinutes: currentConfig?.durationMinutes,
158
158
  };
159
159
  ctx.mux.updateRespawnConfig(id, merged);
@@ -1 +1 @@
1
- {"version":3,"file":"respawn-routes.js","sourceRoot":"","sources":["../../../src/web/routes/respawn-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"respawn-routes.js","sourceRoot":"","sources":["../../../src/web/routes/respawn-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAA+B,MAAM,gBAAgB,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAsB,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAErC,wFAAwF;AACxF,MAAM,aAAa,GAAc;IAC/B,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;IACnB,qBAAqB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC/B,iBAAiB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC3B,8BAA8B,EAAE,GAAG,EAAE,GAAE,CAAC;IACxC,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,GAAoB,EACpB,GAAmE;IAEnE,kEAAkE;IAClE,0BAA0B;IAC1B,kEAAkE;IAElE,2CAA2C;IAE3C,GAAG,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACjD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,GAAG,UAAU,CAAC,SAAS,EAAE;SAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,2CAA2C;IAE3C,GAAG,CAAC,GAAG,CAAC,kCAAkC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACxD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACzE,CAAC;QAED,iDAAiD;QACjD,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;QACxD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC7D,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,uBAAuB;IACvB,kEAAkE;IAElE,sCAAsC;IAEtC,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACxD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,IAAI,IAAwC,CAAC;QAC7C,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,GAAG,MAAM,CAAC,IAA8B,CAAC;QAC/C,CAAC;QACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,iDAAiD;QACjD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,gDAAgD,CAAC,CAAC;QAC3G,CAAC;QAED,oCAAoC;QACpC,IAAI,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,kEAAkE;YAClE,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;YACxD,MAAM,MAAM,GAAG,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACzE,UAAU,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACpD,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC3C,GAAG,CAAC,qBAAqB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,IAAI,EAAE,CAAC;YAChB,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,uDAAuD;QACvD,GAAG,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;QAClD,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAE1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,qCAAqC;IAErC,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACvD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,mBAAmB,CAAC,YAAY,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAC;QACrF,CAAC;QAED,UAAU,CAAC,IAAI,EAAE,CAAC;QAElB,sFAAsF;QACtF,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAElC,0BAA0B;QAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9B,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QAED,iCAAiC;QACjC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAE/B,4CAA4C;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAE1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAE9C,GAAG,CAAC,GAAG,CAAC,kCAAkC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACxD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,+DAA+D;QAC/D,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,2BAA2B,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjH,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,IAA8B,CAAC;QAC1D,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElD,IAAI,UAAU,EAAE,CAAC;YACf,4BAA4B;YAC5B,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAChC,GAAG,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;YAClD,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAChG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;QAC3D,CAAC;QAED,qEAAqE;QACrE,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,QAAQ,EAAE,aAAa,CAAC;QAC9C,MAAM,MAAM,GAA2B;YACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,aAAa,EAAE,OAAO,IAAI,KAAK;YAC1D,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,aAAa,EAAE,aAAa,IAAI,KAAK;YAC5E,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,aAAa,EAAE,YAAY,IAAI,mCAAmC;YACvG,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,aAAa,EAAE,gBAAgB,IAAI,IAAI;YACpF,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,aAAa,EAAE,SAAS,IAAI,IAAI;YAC/D,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,aAAa,EAAE,QAAQ,IAAI,IAAI;YAC5D,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,aAAa,EAAE,eAAe;YACzE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,aAAa,EAAE,iBAAiB,IAAI,IAAI;YACvF,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,aAAa,EAAE,iBAAiB,IAAI,IAAI;YACvF,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,aAAa,EAAE,kBAAkB,IAAI,IAAI;YAC1F,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,aAAa,EAAE,gBAAgB,IAAI,cAAc;YAC9F,qBAAqB,EACnB,MAAM,CAAC,qBAAqB,IAAI,aAAa,EAAE,qBAAqB,IAAI,yBAAyB;YACnG,oBAAoB,EAClB,MAAM,CAAC,oBAAoB,IAAI,aAAa,EAAE,oBAAoB,IAAI,wBAAwB;YAChG,qBAAqB,EACnB,MAAM,CAAC,qBAAqB,IAAI,aAAa,EAAE,qBAAqB,IAAI,yBAAyB;YACnG,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,aAAa,EAAE,kBAAkB,IAAI,IAAI;YAC1F,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,aAAa,EAAE,gBAAgB,IAAI,cAAc;YAC9F,qBAAqB,EACnB,MAAM,CAAC,qBAAqB,IAAI,aAAa,EAAE,qBAAqB,IAAI,yBAAyB;YACnG,oBAAoB,EAClB,MAAM,CAAC,oBAAoB,IAAI,aAAa,EAAE,oBAAoB,IAAI,wBAAwB;YAChG,qBAAqB,EACnB,MAAM,CAAC,qBAAqB,IAAI,aAAa,EAAE,qBAAqB,IAAI,yBAAyB;YACnG,eAAe,EAAE,aAAa,EAAE,eAAe;SAChD,CAAC;QACF,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACxC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,8DAA8D;IAC9D,kEAAkE;IAElE,kFAAkF;IAElF,GAAG,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC9D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAChH,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAGrB,CAAC;QACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACrB,OAAO,mBAAmB,CAAC,YAAY,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;QAC3E,CAAC;QAED,iDAAiD;QACjD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,gDAAgD,CAAC,CAAC;QAC3G,CAAC;QAED,IAAI,CAAC;YACH,8HAA8H;YAC9H,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;gBACnF,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;gBAC/D,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;oBAClC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,4BAA4B;YAC5B,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACjC,eAAe,EAAE,CAAC,GAAG,CAAC;gBACpB,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,EAAE;gBACb,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,qBAAqB;aAC9B,CAAC,CAAC;YACH,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAE7F,sCAAsC;YACtC,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YACvE,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC3C,GAAG,CAAC,qBAAqB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC1C,UAAU,CAAC,KAAK,EAAE,CAAC;YAEnB,0CAA0C;YAC1C,IAAI,IAAI,EAAE,eAAe,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;gBACtD,GAAG,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAClD,CAAC;YAED,iDAAiD;YACjD,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAE1F,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,OAAO,EAAE,0CAA0C;oBACnD,aAAa,EAAE,UAAU,CAAC,SAAS,EAAE;iBACtC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,2DAA2D;IAE3D,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACzD,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC3G,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAqE,CAAC;QAC5F,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAE3C,iDAAiD;QACjD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,gDAAgD,CAAC,CAAC;QAC3G,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,OAAO,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,yCAAyC,CAAC,CAAC;QACvG,CAAC;QAED,kCAAkC;QAClC,MAAM,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,kBAAkB,EAAE,CAAC;YACvB,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QAED,wEAAwE;QACxE,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1D,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC3C,GAAG,CAAC,qBAAqB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC1C,UAAU,CAAC,KAAK,EAAE,CAAC;QAEnB,0CAA0C;QAC1C,IAAI,IAAI,EAAE,eAAe,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAClD,CAAC;QAED,uDAAuD;QACvD,GAAG,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QACzE,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAE1F,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,qCAAqC;YAC9C,aAAa,EAAE,UAAU,CAAC,SAAS,EAAE;SACtC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -36,6 +36,11 @@ export declare class WebServer extends EventEmitter {
36
36
  private transcriptWatchers;
37
37
  private sessionListenerRefs;
38
38
  private scheduledRuns;
39
+ /**
40
+ * SSE clients mapped to their session subscription filter.
41
+ * Value is a Set of session IDs the client wants events for,
42
+ * or `null` meaning "receive all events" (backwards-compatible default).
43
+ */
39
44
  private sseClients;
40
45
  /** Clients with backpressure — skip writes until 'drain' fires */
41
46
  private backpressuredClients;
@@ -176,6 +181,11 @@ export declare class WebServer extends EventEmitter {
176
181
  private sendSSE;
177
182
  private sendSSEPreformatted;
178
183
  private broadcast;
184
+ /**
185
+ * Extract the session ID from an event's data payload for subscription filtering.
186
+ * Returns the sessionId string if the event is session-scoped, or null for global events.
187
+ */
188
+ private extractSessionId;
179
189
  private batchTerminalData;
180
190
  /** Flush a single session's batched terminal data */
181
191
  private flushSessionTerminalBatch;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
@@ -64,7 +64,7 @@ import { SseEvent } from './sse-events.js';
64
64
  import { registerAuthMiddleware, registerSecurityHeaders } from './middleware/auth.js';
65
65
  import { registerPushRoutes, registerTeamRoutes, registerMuxRoutes, registerFileRoutes, registerScheduledRoutes, registerHookEventRoutes, registerSystemRoutes, registerCaseRoutes, registerSessionRoutes, registerRespawnRoutes, registerRalphRoutes, registerPlanRoutes, } from './routes/index.js';
66
66
  const __dirname = dirname(fileURLToPath(import.meta.url));
67
- import { TERMINAL_BATCH_INTERVAL, TASK_UPDATE_BATCH_INTERVAL, STATE_UPDATE_DEBOUNCE_INTERVAL, SESSIONS_LIST_CACHE_TTL, SCHEDULED_CLEANUP_INTERVAL, SCHEDULED_RUN_MAX_AGE, SSE_HEARTBEAT_INTERVAL, SSE_PADDING_SIZE, SESSION_LIMIT_WAIT_MS, ITERATION_PAUSE_MS, BATCH_FLUSH_THRESHOLD, STATS_COLLECTION_INTERVAL_MS, } from '../config/server-timing.js';
67
+ import { TERMINAL_BATCH_INTERVAL, TASK_UPDATE_BATCH_INTERVAL, STATE_UPDATE_DEBOUNCE_INTERVAL, SESSIONS_LIST_CACHE_TTL, SCHEDULED_CLEANUP_INTERVAL, SCHEDULED_RUN_MAX_AGE, SSE_HEARTBEAT_INTERVAL, SSE_PADDING_SIZE, SESSION_LIMIT_WAIT_MS, ITERATION_PAUSE_MS, BATCH_FLUSH_THRESHOLD, STATS_COLLECTION_INTERVAL_MS, INACTIVITY_TIMEOUT_MS, } from '../config/server-timing.js';
68
68
  // DEC mode 2026 - Synchronized Output
69
69
  // When terminal supports this, it buffers all output between start/end markers
70
70
  // and renders atomically, eliminating partial-frame flicker from Ink redraws.
@@ -113,7 +113,12 @@ export class WebServer extends EventEmitter {
113
113
  // Store session listener references for explicit cleanup (prevents memory leaks)
114
114
  sessionListenerRefs = new Map();
115
115
  scheduledRuns = new Map();
116
- sseClients = new Set();
116
+ /**
117
+ * SSE clients mapped to their session subscription filter.
118
+ * Value is a Set of session IDs the client wants events for,
119
+ * or `null` meaning "receive all events" (backwards-compatible default).
120
+ */
121
+ sseClients = new Map();
117
122
  /** Clients with backpressure — skip writes until 'drain' fires */
118
123
  backpressuredClients = new Set();
119
124
  store = getStore();
@@ -128,7 +133,7 @@ export class WebServer extends EventEmitter {
128
133
  // Adaptive batching: track rapid events to extend batch window (per-session)
129
134
  // StaleExpirationMap auto-cleans entries for sessions that stop generating output
130
135
  lastTerminalEventTime = new StaleExpirationMap({
131
- ttlMs: 5 * 60 * 1000, // 5 minutes - auto-expire stale session timing data
136
+ ttlMs: INACTIVITY_TIMEOUT_MS, // 5 minutes - auto-expire stale session timing data
132
137
  refreshOnGet: false, // Don't refresh on reads, only on explicit sets
133
138
  });
134
139
  // Centralized cleanup for standalone timers (intervals + resettable timeouts)
@@ -453,13 +458,27 @@ export class WebServer extends EventEmitter {
453
458
  reply.code(503).send('Too many SSE connections');
454
459
  return;
455
460
  }
461
+ // Parse optional session subscription filter from query parameter.
462
+ // /api/events?sessions=id1,id2 — client only receives events for those sessions.
463
+ // /api/events (no param) — client receives all events (backwards-compatible).
464
+ const query = req.query;
465
+ let sessionFilter = null;
466
+ if (query.sessions) {
467
+ const ids = query.sessions
468
+ .split(',')
469
+ .map((s) => s.trim())
470
+ .filter(Boolean);
471
+ if (ids.length > 0) {
472
+ sessionFilter = new Set(ids);
473
+ }
474
+ }
456
475
  reply.raw.writeHead(200, {
457
476
  'Content-Type': 'text/event-stream',
458
477
  'Cache-Control': 'no-cache',
459
478
  Connection: 'keep-alive',
460
479
  'X-Accel-Buffering': 'no', // Disable nginx buffering
461
480
  });
462
- this.sseClients.add(reply);
481
+ this.sseClients.set(reply, sessionFilter);
463
482
  // Send initial state
464
483
  // Use light state for SSE init to avoid sending 2MB+ terminal buffers
465
484
  // Buffers are fetched on-demand when switching tabs
@@ -1644,7 +1663,8 @@ export class WebServer extends EventEmitter {
1644
1663
  // Client may have missed terminal data during backpressure.
1645
1664
  // Tell it to reload the active session's buffer to recover.
1646
1665
  try {
1647
- reply.raw.write(`event: ${SseEvent.SessionNeedsRefresh}\ndata: {}\n\n`);
1666
+ const drainPadding = this._isTunnelActive ? SSE_PADDING : '';
1667
+ reply.raw.write(`event: ${SseEvent.SessionNeedsRefresh}\ndata: {}\n\n${drainPadding}`);
1648
1668
  }
1649
1669
  catch {
1650
1670
  /* client gone */
@@ -1671,9 +1691,12 @@ export class WebServer extends EventEmitter {
1671
1691
  this.cachedSessionsList = null;
1672
1692
  }
1673
1693
  // Performance optimization: serialize JSON once for all clients.
1674
- // Only append Cloudflare tunnel padding when tunnel is actually active
1675
- // direct/Tailscale clients don't need 8KB padding on every event.
1676
- const padding = this._isTunnelActive ? SSE_PADDING : '';
1694
+ // Only append Cloudflare tunnel padding for latency-sensitive events
1695
+ // Recovery events need immediate proxy flush; low-frequency metadata events
1696
+ // (session:created, ralph:*, respawn:*, etc.) don't need padding.
1697
+ // Note: session:terminal has its own padding in flushSessionTerminalBatch().
1698
+ const needsPadding = this._isTunnelActive && event === SseEvent.SessionNeedsRefresh;
1699
+ const padding = needsPadding ? SSE_PADDING : '';
1677
1700
  let message;
1678
1701
  try {
1679
1702
  message = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n` + padding;
@@ -1683,10 +1706,33 @@ export class WebServer extends EventEmitter {
1683
1706
  console.error(`[Server] Failed to serialize SSE event "${event}":`, err);
1684
1707
  return;
1685
1708
  }
1686
- for (const client of this.sseClients) {
1709
+ // Extract sessionId from event data for subscription filtering.
1710
+ const eventSessionId = this.extractSessionId(event, data);
1711
+ for (const [client, filter] of this.sseClients) {
1712
+ // No filter (null) = receive everything. Otherwise, skip if event is
1713
+ // session-scoped and the session isn't in the client's subscription set.
1714
+ if (filter && eventSessionId && !filter.has(eventSessionId))
1715
+ continue;
1687
1716
  this.sendSSEPreformatted(client, message);
1688
1717
  }
1689
1718
  }
1719
+ /**
1720
+ * Extract the session ID from an event's data payload for subscription filtering.
1721
+ * Returns the sessionId string if the event is session-scoped, or null for global events.
1722
+ */
1723
+ extractSessionId(event, data) {
1724
+ if (data == null || typeof data !== 'object')
1725
+ return null;
1726
+ const record = data;
1727
+ // Most session-scoped events use `sessionId`
1728
+ if (typeof record.sessionId === 'string')
1729
+ return record.sessionId;
1730
+ // Session lifecycle events (session:*) use `id` from the session state object
1731
+ if (typeof record.id === 'string' && event.startsWith('session:'))
1732
+ return record.id;
1733
+ // No session ID found — treat as global event (sent to all clients)
1734
+ return null;
1735
+ }
1690
1736
  // Batch terminal data for better performance (60fps)
1691
1737
  // Uses per-session timers with adaptive intervals to prevent thundering herd:
1692
1738
  // each session flushes independently rather than all sessions flushing in one burst.
@@ -1759,8 +1805,14 @@ export class WebServer extends EventEmitter {
1759
1805
  // Fast path: build SSE message directly without JSON.stringify on wrapper object.
1760
1806
  // Only the terminal data string needs escaping; sessionId is a UUID (safe to template).
1761
1807
  const escapedData = JSON.stringify(syncData);
1762
- const message = `event: session:terminal\ndata: {"id":"${sessionId}","data":${escapedData}}\n\n`;
1763
- for (const client of this.sseClients) {
1808
+ // Append tunnel padding for immediate Cloudflare proxy flush —
1809
+ // terminal data is high-frequency and latency-sensitive.
1810
+ const padding = this._isTunnelActive ? SSE_PADDING : '';
1811
+ const message = `event: session:terminal\ndata: {"id":"${sessionId}","data":${escapedData}}\n\n` + padding;
1812
+ for (const [client, filter] of this.sseClients) {
1813
+ // Skip clients that have a session filter and aren't subscribed to this session
1814
+ if (filter && !filter.has(sessionId))
1815
+ continue;
1764
1816
  this.sendSSEPreformatted(client, message);
1765
1817
  }
1766
1818
  }
@@ -1909,7 +1961,7 @@ export class WebServer extends EventEmitter {
1909
1961
  */
1910
1962
  cleanupDeadSSEClients() {
1911
1963
  const deadClients = [];
1912
- for (const client of this.sseClients) {
1964
+ for (const [client] of this.sseClients) {
1913
1965
  try {
1914
1966
  // Check if the underlying socket is still writable
1915
1967
  const socket = client.raw.socket;
@@ -1991,7 +2043,7 @@ export class WebServer extends EventEmitter {
1991
2043
  // Start token recording timer (every 5 minutes for long-running sessions)
1992
2044
  this.cleanup.setInterval(() => {
1993
2045
  this.recordPeriodicTokenUsage();
1994
- }, 5 * 60 * 1000, { description: 'periodic token recording' });
2046
+ }, INACTIVITY_TIMEOUT_MS, { description: 'periodic token recording' });
1995
2047
  // Start subagent watcher for Claude Code background agent visibility (if enabled)
1996
2048
  if (await this.isSubagentTrackingEnabled()) {
1997
2049
  subagentWatcher.start();
@@ -2247,7 +2299,7 @@ export class WebServer extends EventEmitter {
2247
2299
  // Dispose all managed timers (intervals + resettable timeouts)
2248
2300
  this.cleanup.dispose();
2249
2301
  // Gracefully close all SSE connections before clearing
2250
- for (const client of this.sseClients) {
2302
+ for (const [client] of this.sseClients) {
2251
2303
  try {
2252
2304
  // Send a final event to notify clients of shutdown
2253
2305
  this.sendSSE(client, 'server:shutdown', { reason: 'Server stopping' });