@monotykamary/localterm-server 2.66.8 → 2.66.9

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 (125) hide show
  1. package/dist/agent-git-status.d.ts +3 -0
  2. package/dist/agent-git-status.d.ts.map +1 -0
  3. package/dist/agent-git-status.js +46 -0
  4. package/dist/agent-git-status.js.map +1 -0
  5. package/dist/agent-log-utils.d.ts +18 -0
  6. package/dist/agent-log-utils.d.ts.map +1 -0
  7. package/dist/agent-log-utils.js +123 -0
  8. package/dist/agent-log-utils.js.map +1 -0
  9. package/dist/agent-models.d.ts +4 -0
  10. package/dist/agent-models.d.ts.map +1 -0
  11. package/dist/agent-models.js +100 -0
  12. package/dist/agent-models.js.map +1 -0
  13. package/dist/agent-runner.d.ts +3 -5
  14. package/dist/agent-runner.d.ts.map +1 -1
  15. package/dist/agent-runner.js +8 -522
  16. package/dist/agent-runner.js.map +1 -1
  17. package/dist/agent-session-reader.d.ts +3 -0
  18. package/dist/agent-session-reader.d.ts.map +1 -0
  19. package/dist/agent-session-reader.js +113 -0
  20. package/dist/agent-session-reader.js.map +1 -0
  21. package/dist/build-pty-environment.d.ts +8 -0
  22. package/dist/build-pty-environment.d.ts.map +1 -0
  23. package/dist/build-pty-environment.js +44 -0
  24. package/dist/build-pty-environment.js.map +1 -0
  25. package/dist/caffeinate-automatic-detector.d.ts +57 -0
  26. package/dist/caffeinate-automatic-detector.d.ts.map +1 -0
  27. package/dist/caffeinate-automatic-detector.js +275 -0
  28. package/dist/caffeinate-automatic-detector.js.map +1 -0
  29. package/dist/caffeinate-battery-guard.d.ts +35 -0
  30. package/dist/caffeinate-battery-guard.d.ts.map +1 -0
  31. package/dist/caffeinate-battery-guard.js +190 -0
  32. package/dist/caffeinate-battery-guard.js.map +1 -0
  33. package/dist/caffeinate-manager.d.ts +5 -31
  34. package/dist/caffeinate-manager.d.ts.map +1 -1
  35. package/dist/caffeinate-manager.js +55 -400
  36. package/dist/caffeinate-manager.js.map +1 -1
  37. package/dist/cdp/cdp-client.d.ts +4 -70
  38. package/dist/cdp/cdp-client.d.ts.map +1 -1
  39. package/dist/cdp/cdp-client.js +58 -418
  40. package/dist/cdp/cdp-client.js.map +1 -1
  41. package/dist/cdp/cdp-connection.d.ts +72 -0
  42. package/dist/cdp/cdp-connection.d.ts.map +1 -0
  43. package/dist/cdp/cdp-connection.js +272 -0
  44. package/dist/cdp/cdp-connection.js.map +1 -0
  45. package/dist/cdp/constants.d.ts +6 -0
  46. package/dist/cdp/constants.d.ts.map +1 -0
  47. package/dist/cdp/constants.js +9 -0
  48. package/dist/cdp/constants.js.map +1 -0
  49. package/dist/cdp/target-registry.d.ts +41 -0
  50. package/dist/cdp/target-registry.d.ts.map +1 -0
  51. package/dist/cdp/target-registry.js +118 -0
  52. package/dist/cdp/target-registry.js.map +1 -0
  53. package/dist/constants.d.ts +2 -0
  54. package/dist/constants.d.ts.map +1 -1
  55. package/dist/constants.js +2 -0
  56. package/dist/constants.js.map +1 -1
  57. package/dist/git-branch-metadata.d.ts +11 -0
  58. package/dist/git-branch-metadata.d.ts.map +1 -0
  59. package/dist/git-branch-metadata.js +85 -0
  60. package/dist/git-branch-metadata.js.map +1 -0
  61. package/dist/git-diff-cache.d.ts +13 -0
  62. package/dist/git-diff-cache.d.ts.map +1 -0
  63. package/dist/git-diff-cache.js +32 -0
  64. package/dist/git-diff-cache.js.map +1 -0
  65. package/dist/git-diff-parser.d.ts +15 -0
  66. package/dist/git-diff-parser.d.ts.map +1 -0
  67. package/dist/git-diff-parser.js +196 -0
  68. package/dist/git-diff-parser.js.map +1 -0
  69. package/dist/git-diff-service.d.ts +10 -0
  70. package/dist/git-diff-service.d.ts.map +1 -0
  71. package/dist/git-diff-service.js +395 -0
  72. package/dist/git-diff-service.js.map +1 -0
  73. package/dist/git-diff.d.ts +8 -41
  74. package/dist/git-diff.d.ts.map +1 -1
  75. package/dist/git-diff.js +5 -944
  76. package/dist/git-diff.js.map +1 -1
  77. package/dist/github-pr.d.ts +32 -0
  78. package/dist/github-pr.d.ts.map +1 -0
  79. package/dist/github-pr.js +266 -0
  80. package/dist/github-pr.js.map +1 -0
  81. package/dist/pi-binary-resolver.d.ts +6 -0
  82. package/dist/pi-binary-resolver.d.ts.map +1 -0
  83. package/dist/pi-binary-resolver.js +70 -0
  84. package/dist/pi-binary-resolver.js.map +1 -0
  85. package/dist/pi-rpc-client.d.ts +14 -0
  86. package/dist/pi-rpc-client.d.ts.map +1 -0
  87. package/dist/pi-rpc-client.js +87 -0
  88. package/dist/pi-rpc-client.js.map +1 -0
  89. package/dist/session-client-hub.d.ts +57 -0
  90. package/dist/session-client-hub.d.ts.map +1 -0
  91. package/dist/session-client-hub.js +435 -0
  92. package/dist/session-client-hub.js.map +1 -0
  93. package/dist/session-command-executor.d.ts +14 -0
  94. package/dist/session-command-executor.d.ts.map +1 -0
  95. package/dist/session-command-executor.js +207 -0
  96. package/dist/session-command-executor.js.map +1 -0
  97. package/dist/session-git-event-bridge.d.ts +16 -0
  98. package/dist/session-git-event-bridge.d.ts.map +1 -0
  99. package/dist/session-git-event-bridge.js +56 -0
  100. package/dist/session-git-event-bridge.js.map +1 -0
  101. package/dist/session-lifecycle-policy.d.ts +15 -0
  102. package/dist/session-lifecycle-policy.d.ts.map +1 -0
  103. package/dist/session-lifecycle-policy.js +105 -0
  104. package/dist/session-lifecycle-policy.js.map +1 -0
  105. package/dist/session-manager.d.ts +11 -42
  106. package/dist/session-manager.d.ts.map +1 -1
  107. package/dist/session-manager.js +72 -987
  108. package/dist/session-manager.js.map +1 -1
  109. package/dist/session-output-coordinator.d.ts +21 -0
  110. package/dist/session-output-coordinator.d.ts.map +1 -0
  111. package/dist/session-output-coordinator.js +134 -0
  112. package/dist/session-output-coordinator.js.map +1 -0
  113. package/dist/session-output-transport.d.ts +22 -0
  114. package/dist/session-output-transport.d.ts.map +1 -0
  115. package/dist/session-output-transport.js +160 -0
  116. package/dist/session-output-transport.js.map +1 -0
  117. package/dist/session.d.ts +0 -4
  118. package/dist/session.d.ts.map +1 -1
  119. package/dist/session.js +11 -258
  120. package/dist/session.js.map +1 -1
  121. package/dist/shell-hook-builder.d.ts +16 -0
  122. package/dist/shell-hook-builder.d.ts.map +1 -0
  123. package/dist/shell-hook-builder.js +230 -0
  124. package/dist/shell-hook-builder.js.map +1 -0
  125. package/package.json +1 -1
@@ -1,8 +1,9 @@
1
1
  import { EventEmitter } from "node:events";
2
- import { defaultBatteryProbe, } from "./caffeinate-battery.js";
3
- import { anySessionRunsTrigger, commandMatchesTriggers, defaultSnapshotProcesses, } from "./caffeinate-process-match.js";
4
- import { CAFFEINATE_ACTIVITY_GATE_DEBOUNCE_MS, CAFFEINATE_AUTO_DEFAULT_COMMANDS, CAFFEINATE_AUTO_POKE_DEBOUNCE_MS, CAFFEINATE_BATTERY_POLL_MAX_INTERVAL_MS, CAFFEINATE_BATTERY_POLL_MIN_INTERVAL_MS, CAFFEINATE_BATTERY_POLL_TIME_FRACTION, MS_PER_MINUTE, } from "./constants.js";
5
- const EMPTY_FOREGROUND_NAMES = new Map();
2
+ import { CaffeinateAutomaticDetector } from "./caffeinate-automatic-detector.js";
3
+ import { defaultBatteryProbe } from "./caffeinate-battery.js";
4
+ import { CaffeinateBatteryGuard } from "./caffeinate-battery-guard.js";
5
+ import { defaultSnapshotProcesses } from "./caffeinate-process-match.js";
6
+ import { CAFFEINATE_AUTO_DEFAULT_COMMANDS } from "./constants.js";
6
7
  // Decides *when* the daemon's single keep-awake process runs, on top of the
7
8
  // dumb CaffeinateController (which only knows start/stop). In "on" it is always
8
9
  // active, in "off" never, and in "automatic" it tracks whether any recognized
@@ -45,57 +46,38 @@ const EMPTY_FOREGROUND_NAMES = new Map();
45
46
  export class CaffeinateManager extends EventEmitter {
46
47
  controller;
47
48
  store;
48
- listSessionPids;
49
- snapshotProcesses;
50
- checkRecentOutput;
51
- hasPeerClient;
52
- foregroundNames;
53
- batteryProbe;
49
+ automaticDetector;
50
+ batteryGuard;
54
51
  defaultCommands;
55
- autoActive = false;
56
- autoTrigger = null;
57
- // Whether the most recent poll held caffeinate because a peer was attached
58
- // (vs. a recognized program). Drives the activity-gate timer arming: a peer
59
- // holds until it disconnects (an event that pokes its own re-check), so the
60
- // silence-release timer must not arm while one is present.
61
- autoPeerActive = false;
62
- pokeTimer = null;
63
- activityGateTimer = null;
64
- // The cached battery-suppression flag: true means the machine is on battery
65
- // power at or below the configured threshold, so `recompute` suppresses
66
- // caffeinate regardless of what the mode wants.
67
- batteryLow = false;
68
- // The most recent battery read, used to choose the next adaptive delay. Null
69
- // until the first read completes (and is reset to null after a read failure
70
- // so computeBatteryDelay's null branch picks MAX — fail-open retries slowly).
71
- lastBatteryStatus = null;
72
- // Whether performBatteryCheck has resolved at least once. Drives
73
- // `needsFirstProbe` in `recompute` independently of lastBatteryStatus: a
74
- // daemon that boots with the battery already below the floor never briefly
75
- // spawns the power assertion before the first read suppresses it, while a
76
- // later failed read (lastBatteryStatus -> null) still fail-opens instead of
77
- // re-gating caffeinate off forever.
78
- hasProbedBattery = false;
79
- batteryTimer = null;
80
- // Coalesces concurrent battery checks: callers (the timer, setBatteryThreshold,
81
- // pollBatteryNow) all funnel through runBatteryCheck, which returns the same
82
- // in-flight promise so they all settle on the same result without piling up
83
- // battery reads — the promise-tracking analogue of pollAuto's polling flag.
84
- batteryCheckInFlight = null;
85
- polling = false;
86
- pollQueued = false;
87
52
  disposed = false;
88
53
  constructor(options) {
89
54
  super();
90
55
  this.controller = options.controller;
91
56
  this.store = options.store;
92
- this.listSessionPids = options.listSessionPids;
93
- this.snapshotProcesses = options.snapshotProcesses ?? defaultSnapshotProcesses;
94
57
  this.defaultCommands = options.defaultCommands ?? CAFFEINATE_AUTO_DEFAULT_COMMANDS;
95
- this.checkRecentOutput = options.hasRecentOutput;
96
- this.hasPeerClient = options.hasPeerClient ?? (() => false);
97
- this.foregroundNames = options.foregroundNames;
98
- this.batteryProbe = options.batteryProbe ?? defaultBatteryProbe;
58
+ this.automaticDetector = new CaffeinateAutomaticDetector({
59
+ listSessionPids: options.listSessionPids,
60
+ snapshotProcesses: options.snapshotProcesses ?? defaultSnapshotProcesses,
61
+ defaultCommands: this.defaultCommands,
62
+ getCommands: () => this.store.getCommands(),
63
+ getMode: () => this.mode,
64
+ getActivityGate: () => this.activityGate,
65
+ getPeerKeepAwake: () => this.peerKeepAwake,
66
+ isSupported: () => this.supported,
67
+ hasRecentOutput: options.hasRecentOutput,
68
+ hasPeerClient: options.hasPeerClient ?? (() => false),
69
+ foregroundNames: options.foregroundNames,
70
+ emitChange: () => this.emit("change"),
71
+ recompute: () => this.recompute(),
72
+ });
73
+ this.batteryGuard = new CaffeinateBatteryGuard({
74
+ batteryProbe: options.batteryProbe ?? defaultBatteryProbe,
75
+ getBatteryThreshold: () => this.batteryThreshold,
76
+ isSupported: () => this.supported,
77
+ wantsActive: () => this.modeWantsActive(),
78
+ emitChange: () => this.emit("change"),
79
+ recompute: () => this.recompute(),
80
+ });
99
81
  // An unexpected death of the caffeinate process flips controller state; pass
100
82
  // that through so every tab rebroadcasts the authoritative `active`.
101
83
  this.controller.on("change", () => this.emit("change"));
@@ -103,7 +85,7 @@ export class CaffeinateManager extends EventEmitter {
103
85
  // One snapshot at startup in case a trigger is already running before any
104
86
  // event arrives; from here on detection is purely event-driven.
105
87
  if (this.mode === "automatic" && this.supported)
106
- void this.pollAuto();
88
+ void this.automaticDetector.poll();
107
89
  }
108
90
  get supported() {
109
91
  return this.controller.supported;
@@ -127,30 +109,19 @@ export class CaffeinateManager extends EventEmitter {
127
109
  return this.store.getBatteryThreshold();
128
110
  }
129
111
  get activeTrigger() {
130
- return this.autoActive ? this.autoTrigger : null;
112
+ return this.automaticDetector.activeTrigger;
131
113
  }
132
- // Whether automatic mode is currently holding caffeinate because a peer (a
133
- // second client on a session) is attached — independent of the program
134
- // trigger, so the UI can highlight the peer setting row even when a program
135
- // is also active (in which case `activeTrigger` carries the program name).
136
114
  get peerActive() {
137
- return this.autoPeerActive;
115
+ return this.automaticDetector.peerActive;
138
116
  }
139
117
  setMode(mode) {
140
118
  if (this.disposed)
141
119
  return;
142
120
  this.store.setMode(mode);
143
- // Leaving automatic clears the cached detection so a later return to
144
- // automatic re-derives it from scratch rather than trusting a stale flag.
145
- if (mode !== "automatic") {
146
- this.autoActive = false;
147
- this.autoTrigger = null;
148
- this.autoPeerActive = false;
149
- this.clearActivityGateTimer();
150
- }
121
+ this.automaticDetector.modeChanged(mode);
151
122
  this.recompute();
152
123
  if (mode === "automatic" && this.supported)
153
- void this.pollAuto();
124
+ void this.automaticDetector.poll();
154
125
  this.emit("change");
155
126
  }
156
127
  setCommands(commands) {
@@ -159,25 +130,14 @@ export class CaffeinateManager extends EventEmitter {
159
130
  this.store.setCommands(commands);
160
131
  // The trigger set changed; re-derive automatic detection immediately.
161
132
  if (this.mode === "automatic" && this.supported)
162
- void this.pollAuto();
133
+ void this.automaticDetector.poll();
163
134
  this.emit("change");
164
135
  }
165
136
  setActivityGate(enabled) {
166
137
  if (this.disposed)
167
138
  return;
168
139
  this.store.setActivityGate(enabled);
169
- if (enabled) {
170
- // Gate just turned on — re-check whether caffeinate should still be
171
- // active given current output activity.
172
- if (this.mode === "automatic" && this.supported)
173
- void this.pollAuto();
174
- }
175
- else {
176
- // Gate turned off — no need to re-snapshot; just recompute (which will
177
- // drop the output check from the condition).
178
- this.clearActivityGateTimer();
179
- this.recompute();
180
- }
140
+ this.automaticDetector.activityGateChanged(enabled);
181
141
  this.emit("change");
182
142
  }
183
143
  setPeerKeepAwake(enabled) {
@@ -187,131 +147,24 @@ export class CaffeinateManager extends EventEmitter {
187
147
  // The trigger set changed; re-derive automatic detection immediately so a
188
148
  // peer that was already attached engages (or releases) at once.
189
149
  if (this.mode === "automatic" && this.supported)
190
- void this.pollAuto();
150
+ void this.automaticDetector.poll();
191
151
  this.emit("change");
192
152
  }
193
- // Cheap, debounced nudge to re-check automatic detection in response to an
194
- // event (a session's foreground process changing, or a session
195
- // connecting/disconnecting). The debounce coalesces a burst of simultaneous
196
- // events into a single `ps` snapshot — it fires once and does not repeat.
197
153
  pokeAuto() {
198
- if (this.disposed || this.mode !== "automatic" || !this.supported)
199
- return;
200
- if (this.pokeTimer !== null)
201
- return;
202
- this.pokeTimer = setTimeout(() => {
203
- this.pokeTimer = null;
204
- void this.pollAuto();
205
- }, CAFFEINATE_AUTO_POKE_DEBOUNCE_MS);
206
- this.pokeTimer.unref?.();
154
+ this.automaticDetector.poke();
207
155
  }
208
- // Record that output just arrived from a session. When the activity gate is
209
- // on, this resets the trailing-edge timer that checks whether caffeinate
210
- // should stay active. Output arriving while caffeinate is inactive is a
211
- // no-op (the foreground-change poke already handles the transition).
212
156
  noteOutputActivity() {
213
- if (this.disposed || this.mode !== "automatic" || !this.activityGate || !this.supported) {
214
- return;
215
- }
216
- if (!this.autoActive) {
217
- // Caffeinate is off but output just arrived — nudge a re-check
218
- // (the registry already recorded the fresh output timestamp).
219
- this.pokeAuto();
220
- return;
221
- }
222
- // A peer is holding caffeinate; output is irrelevant to it. The peer
223
- // releases on disconnect (an event that pokes its own re-check), so the
224
- // silence timer must not arm while one is present — otherwise the trailing
225
- // edge would poll on a timer and defeat the event-driven design.
226
- if (this.autoPeerActive)
227
- return;
228
- this.clearActivityGateTimer();
229
- // Schedule a re-check after the debounce window. If more output arrives
230
- // before this fires, the timer resets (trailing-edge).
231
- this.activityGateTimer = setTimeout(() => {
232
- this.activityGateTimer = null;
233
- void this.pollAuto();
234
- }, CAFFEINATE_ACTIVITY_GATE_DEBOUNCE_MS);
235
- this.activityGateTimer.unref?.();
157
+ this.automaticDetector.noteOutputActivity();
236
158
  }
237
- // Force an immediate automatic re-check and resolve when it settles. Used by
238
- // tests; production code re-checks via the event-driven debounced pokeAuto.
239
159
  pollNow() {
240
- return this.pollAuto();
241
- }
242
- dispose() {
243
- this.disposed = true;
244
- if (this.pokeTimer !== null) {
245
- clearTimeout(this.pokeTimer);
246
- this.pokeTimer = null;
247
- }
248
- this.clearActivityGateTimer();
249
- this.clearBatteryTimer();
250
- this.controller.dispose();
251
- this.removeAllListeners();
252
- }
253
- // The effective keep-awake triggers: fixed defaults plus the user's customs,
254
- // lowercased for case-insensitive matching.
255
- triggerSet() {
256
- const triggers = new Set();
257
- for (const command of this.defaultCommands)
258
- triggers.add(command.toLowerCase());
259
- for (const command of this.store.getCommands())
260
- triggers.add(command.toLowerCase());
261
- return triggers;
262
- }
263
- // Whether any live session's shell-hook foreground name (OSC 7777 fg;<token>)
264
- // is itself a keep-awake trigger — the cheap, walk-free path used before
265
- // falling back to the `ps` process-tree snapshot. Returns the matching
266
- // trigger (lowercased) or null when no session's name matches.
267
- hookTriggerFor(pids, triggers) {
268
- const names = this.foregroundNames?.() ?? EMPTY_FOREGROUND_NAMES;
269
- for (const pid of pids) {
270
- const name = names.get(pid);
271
- if (name) {
272
- const match = commandMatchesTriggers(name, triggers);
273
- if (match)
274
- return match;
275
- }
276
- }
277
- return null;
278
- }
279
- recompute() {
280
- const wantActive = this.modeWantsActive();
281
- const guardApplies = this.supported && this.batteryThreshold !== null;
282
- // While the guard is on but we've never read the battery, hold off engaging
283
- // until that first read resolves — otherwise a daemon that boots with the
284
- // battery already below the floor briefly spawns the power assertion before
285
- // the probe suppresses it. Subsequent arms use the cached flag instead.
286
- const needsFirstProbe = guardApplies && !this.hasProbedBattery;
287
- const desired = wantActive && !(guardApplies && (this.batteryLow || needsFirstProbe));
288
- this.controller.setActive(desired);
289
- if (wantActive && guardApplies) {
290
- // Start (or keep) the adaptive battery check armed. The next delay is
291
- // derived from the last status, or an immediate probe when there's no
292
- // cached reading yet.
293
- this.scheduleBatteryCheck(this.lastBatteryStatus);
294
- }
295
- else {
296
- this.clearBatteryTimer();
297
- }
298
- }
299
- modeWantsActive() {
300
- const mode = this.mode;
301
- return mode === "on" || (mode === "automatic" && this.autoActive);
302
- }
303
- clearActivityGateTimer() {
304
- if (this.activityGateTimer !== null) {
305
- clearTimeout(this.activityGateTimer);
306
- this.activityGateTimer = null;
307
- }
160
+ return this.automaticDetector.poll();
308
161
  }
309
162
  // Force an immediate battery re-check and resolve when it settles. Used by
310
163
  // tests; production code re-checks via the adaptive timer. Awaits an already
311
164
  // in-flight check (so concurrent test calls see the same resolved state)
312
165
  // rather than queueing a second probe.
313
166
  pollBatteryNow() {
314
- return this.runBatteryCheck();
167
+ return this.batteryGuard.pollNow();
315
168
  }
316
169
  // Set the persisted battery floor. `null` disables the guard. Persists
317
170
  // immediately (so every tab stays in lockstep via the broadcast) and re-derives
@@ -322,220 +175,22 @@ export class CaffeinateManager extends EventEmitter {
322
175
  return;
323
176
  this.store.setBatteryThreshold(percent);
324
177
  this.emit("change");
325
- // Clear any pending adaptive check so the next read re-arms with a delay
326
- // derived from the new threshold (and a fresh status), not the old one.
327
- this.clearBatteryTimer();
328
- if (!this.supported || percent === null) {
329
- // Guard disabled: clear any stale suppression so it can't keep
330
- // caffeinate off after the user turned the floor off.
331
- this.batteryLow = false;
332
- this.recompute();
333
- return;
334
- }
335
- if (this.modeWantsActive()) {
336
- // Probe immediately so an already-low battery stops caffeinate at once
337
- // (the adaptive arming would otherwise wait up to MAX_INTERVAL for the
338
- // first read, since lastBatteryStatus is stale/null until this resolves).
339
- void this.runBatteryCheck();
340
- }
341
- }
342
- // Single entry point for every battery probe. Coalesces concurrent callers
343
- // onto one in-flight promise so the `pmset` call fires at most once per tick
344
- // even if the timer, setBatteryThreshold, and a manual pollBatteryNow all race.
345
- runBatteryCheck() {
346
- if (this.batteryCheckInFlight !== null)
347
- return this.batteryCheckInFlight;
348
- const promise = this.performBatteryCheck().finally(() => {
349
- if (this.batteryCheckInFlight === promise)
350
- this.batteryCheckInFlight = null;
351
- });
352
- this.batteryCheckInFlight = promise;
353
- return promise;
178
+ this.batteryGuard.thresholdChanged(percent);
354
179
  }
355
- async performBatteryCheck() {
356
- if (this.disposed)
357
- return;
358
- const threshold = this.batteryThreshold;
359
- // Nothing to gate on: unsupported, guard disabled, or nothing wanting
360
- // active. The last case keeps the design claim that reads happen only while
361
- // a mode wants caffeinate active (a probe here would be wasted work and
362
- // couldn't change `desired`, since `wantActive` already forces it false).
363
- if (!this.supported || threshold === null || !this.modeWantsActive()) {
364
- this.clearBatteryTimer();
365
- return;
366
- }
367
- const status = await this.batteryProbe();
368
- if (this.disposed)
369
- return;
370
- this.lastBatteryStatus = status;
371
- this.hasProbedBattery = true;
372
- // Fail-open on read failure (null): a missing battery or a transient pmset
373
- // error cannot take keep-awake away from the user. The scheduler stays
374
- // armed via the recompute below so a later successful read can re-impose
375
- // the floor.
376
- const nextLow = status !== null && status.isOnBattery && status.percent <= threshold;
377
- if (nextLow !== this.batteryLow) {
378
- this.batteryLow = nextLow;
379
- this.emit("change");
380
- }
381
- this.recompute();
382
- }
383
- scheduleBatteryCheck(status) {
384
- if (this.disposed)
385
- return;
386
- // Coalesce: if a check is already armed, let it run — it reschedules
387
- // adaptively from a fresh read when it completes, so re-entry here is a no-op.
388
- if (this.batteryTimer !== null)
389
- return;
390
- if (!this.hasProbedBattery) {
391
- // Never probed: fire immediately (coalesced by runBatteryCheck) so the
392
- // first arm doesn't wait MAX before applying the floor — a daemon that
393
- // boots with the battery already below the threshold suppresses at once.
394
- void this.runBatteryCheck();
395
- return;
396
- }
397
- // A null status here means a prior probe failed or found no battery:
398
- // computeBatteryDelay maps that to MAX so we retry slowly instead of
399
- // re-firing immediately and busy-looping on a persistently-failing read.
400
- const delay = this.computeBatteryDelay(status);
401
- this.batteryTimer = setTimeout(() => {
402
- this.batteryTimer = null;
403
- void this.runBatteryCheck();
404
- }, delay);
405
- this.batteryTimer.unref?.();
406
- }
407
- computeBatteryDelay(status) {
408
- const threshold = this.batteryThreshold;
409
- if (threshold === null)
410
- return CAFFEINATE_BATTERY_POLL_MAX_INTERVAL_MS;
411
- // Already suppressed: poll fast so charging back above the threshold or
412
- // plugging in resumes promptly. Bounded by how long the machine stays
413
- // below the floor — which should be short (it's about to lose power).
414
- if (this.batteryLow)
415
- return CAFFEINATE_BATTERY_POLL_MIN_INTERVAL_MS;
416
- if (status === null || !status.isOnBattery)
417
- return CAFFEINATE_BATTERY_POLL_MAX_INTERVAL_MS;
418
- if (status.minutesToEmpty === null)
419
- return CAFFEINATE_BATTERY_POLL_MAX_INTERVAL_MS;
420
- // Half of the interpolated time-to-threshold: the OS estimate (minutes to
421
- // 0%) scaled by the charge fraction still above the floor. Halving gives a
422
- // 2× buffer against the EWMA lagging real discharge (and the active program
423
- // draining faster than the idle minutes the average was computed over), so
424
- // a stale-high estimate still catches the crossing in time rather than
425
- // sleeping past it. Clamped to [MIN, MAX] below.
426
- const remaining = status.percent - threshold;
427
- if (remaining <= 0)
428
- return CAFFEINATE_BATTERY_POLL_MIN_INTERVAL_MS;
429
- const fractionAbove = remaining / status.percent;
430
- const interpolatedMs = status.minutesToEmpty * MS_PER_MINUTE * fractionAbove;
431
- const scheduledMs = interpolatedMs / CAFFEINATE_BATTERY_POLL_TIME_FRACTION;
432
- return Math.max(CAFFEINATE_BATTERY_POLL_MIN_INTERVAL_MS, Math.min(scheduledMs, CAFFEINATE_BATTERY_POLL_MAX_INTERVAL_MS));
433
- }
434
- clearBatteryTimer() {
435
- if (this.batteryTimer !== null) {
436
- clearTimeout(this.batteryTimer);
437
- this.batteryTimer = null;
438
- }
180
+ dispose() {
181
+ this.disposed = true;
182
+ this.automaticDetector.dispose();
183
+ this.batteryGuard.dispose();
184
+ this.controller.dispose();
185
+ this.removeAllListeners();
439
186
  }
440
- async pollAuto() {
441
- if (this.disposed || this.mode !== "automatic" || !this.supported)
442
- return;
443
- // Serialize: if a snapshot is already running, run exactly one more after it
444
- // so the latest state always wins without piling up `ps` calls.
445
- if (this.polling) {
446
- this.pollQueued = true;
447
- return;
448
- }
449
- this.polling = true;
450
- try {
451
- const pids = this.listSessionPids();
452
- let programActive = false;
453
- let programTrigger = null;
454
- if (pids.length > 0) {
455
- const triggers = this.triggerSet();
456
- // Short-circuit: if any live session's hook-reported foreground name is
457
- // itself a trigger, engage without a `ps` snapshot (the common case —
458
- // the user runs vim/ffmpeg/etc. directly). Only fall back to the
459
- // process-tree walk when no hook name matches, which still catches
460
- // triggers that are children of the foreground command (make -> ffmpeg)
461
- // or running in an unhooked shell (sh/dash).
462
- programTrigger = this.hookTriggerFor(pids, triggers);
463
- if (programTrigger === null) {
464
- const snapshot = await this.snapshotProcesses();
465
- programTrigger = anySessionRunsTrigger(pids, snapshot, triggers);
466
- }
467
- if (programTrigger) {
468
- if (!this.activityGate) {
469
- programActive = true;
470
- }
471
- else if (this.checkRecentOutput) {
472
- programActive = this.checkRecentOutput(pids, CAFFEINATE_ACTIVITY_GATE_DEBOUNCE_MS);
473
- }
474
- }
475
- }
476
- if (this.disposed || this.mode !== "automatic")
477
- return;
478
- // A peer (a second client on a session) holds caffeinate independently of
479
- // the program detection and bypasses the activity gate: an idle-but-
480
- // attached phone must not release the machine to sleep. The peer's hold is
481
- // surfaced via `peerActive` (independent of `activeTrigger`, which carries
482
- // the program name) so the UI can highlight each setting row on its own
483
- // when both are active.
484
- const peerActive = this.peerKeepAwake && this.hasPeerClient();
485
- const next = programActive || peerActive;
486
- const prevAutoActive = this.autoActive;
487
- const prevAutoTrigger = this.autoTrigger;
488
- const prevAutoPeerActive = this.autoPeerActive;
489
- this.autoActive = next;
490
- // `autoTrigger` carries only the program trigger (a command name or null);
491
- // the peer trigger is surfaced separately via `peerActive` so the UI can
492
- // highlight each setting row independently when both are active.
493
- this.autoTrigger = next ? programTrigger : null;
494
- this.autoPeerActive = peerActive;
495
- // Broadcast on any change to the broadcastable derived state, not just
496
- // when caffeinate turns on/off: the trigger identity (which program, or
497
- // whether a peer is holding) can flip while caffeinate stays continuously
498
- // active (a program starting while a peer is attached, a peer leaving
499
- // while a program runs). Without these the UI keeps a stale `activeTrigger`
500
- // / `peerActive` and the wrong row (or none) highlights.
501
- if (next !== prevAutoActive ||
502
- this.autoTrigger !== prevAutoTrigger ||
503
- this.autoPeerActive !== prevAutoPeerActive) {
504
- this.emit("change");
505
- }
506
- this.recompute();
507
- if (peerActive) {
508
- // A peer now holds caffeinate; any program-silence timer armed before
509
- // the peer joined is obsolete (the peer releases on disconnect, not
510
- // on silence). Clear it so a stale trailing edge can't fire a spurious
511
- // poll and re-arm into a timer-driven loop.
512
- this.clearActivityGateTimer();
513
- }
514
- // Arm the silence-release timer only when a gated program is the SOLE
515
- // reason caffeinate is active. A peer holds until it disconnects (which
516
- // pokes its own re-check via onSessionActivity), so silence must not
517
- // release while one is present — and a program active alongside a peer is
518
- // also covered by the peer's hold.
519
- if (this.activityGate && programActive && !peerActive) {
520
- this.armActivityGateTimerIfNeeded();
521
- }
522
- }
523
- finally {
524
- this.polling = false;
525
- if (this.pollQueued && !this.disposed) {
526
- this.pollQueued = false;
527
- void this.pollAuto();
528
- }
529
- }
187
+ recompute() {
188
+ const wantActive = this.modeWantsActive();
189
+ this.controller.setActive(this.batteryGuard.shouldActivate(wantActive));
530
190
  }
531
- armActivityGateTimerIfNeeded() {
532
- if (this.activityGateTimer !== null)
533
- return;
534
- this.activityGateTimer = setTimeout(() => {
535
- this.activityGateTimer = null;
536
- void this.pollAuto();
537
- }, CAFFEINATE_ACTIVITY_GATE_DEBOUNCE_MS);
538
- this.activityGateTimer.unref?.();
191
+ modeWantsActive() {
192
+ const mode = this.mode;
193
+ return mode === "on" || (mode === "automatic" && this.automaticDetector.active);
539
194
  }
540
195
  }
541
196
  //# sourceMappingURL=caffeinate-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"caffeinate-manager.js","sourceRoot":"","sources":["../src/caffeinate-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EACL,mBAAmB,GAGpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,GAEzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,oCAAoC,EACpC,gCAAgC,EAChC,gCAAgC,EAChC,uCAAuC,EACvC,uCAAuC,EACvC,qCAAqC,EACrC,aAAa,GACd,MAAM,gBAAgB,CAAC;AAGxB,MAAM,sBAAsB,GAAwB,IAAI,GAAG,EAAE,CAAC;AA0C9D,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AAC9E,0EAA0E;AAC1E,iFAAiF;AACjF,+EAA+E;AAC/E,0DAA0D;AAC1D,0EAA0E;AAC1E,2EAA2E;AAC3E,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,yEAAyE;AACzE,4EAA4E;AAC5E,6DAA6D;AAC7D,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,8EAA8E;AAC9E,sEAAsE;AACtE,2EAA2E;AAC3E,yEAAyE;AACzE,qDAAqD;AACrD,8EAA8E;AAC9E,wEAAwE;AACxE,YAAY;AACZ,EAAE;AACF,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,mEAAmE;AACnE,+EAA+E;AAC/E,gFAAgF;AAChF,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,0BAA0B;AAC1B,MAAM,OAAO,iBAAkB,SAAQ,YAAqC;IACzD,UAAU,CAAuB;IACjC,KAAK,CAA6B;IAClC,eAAe,CAAiB;IAChC,iBAAiB,CAAoB;IACrC,iBAAiB,CAA0D;IAC3E,aAAa,CAAgB;IAC7B,eAAe,CAA6B;IAC5C,YAAY,CAAe;IACnC,eAAe,CAAoB;IAEpC,UAAU,GAAG,KAAK,CAAC;IACnB,WAAW,GAAkB,IAAI,CAAC;IAC1C,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,2DAA2D;IACnD,cAAc,GAAG,KAAK,CAAC;IACvB,SAAS,GAA0B,IAAI,CAAC;IACxC,iBAAiB,GAA0B,IAAI,CAAC;IACxD,4EAA4E;IAC5E,wEAAwE;IACxE,gDAAgD;IACxC,UAAU,GAAG,KAAK,CAAC;IAC3B,6EAA6E;IAC7E,4EAA4E;IAC5E,8EAA8E;IACtE,iBAAiB,GAAyB,IAAI,CAAC;IACvD,iEAAiE;IACjE,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,4EAA4E;IAC5E,oCAAoC;IAC5B,gBAAgB,GAAG,KAAK,CAAC;IACzB,YAAY,GAA0B,IAAI,CAAC;IACnD,gFAAgF;IAChF,6EAA6E;IAC7E,4EAA4E;IAC5E,4EAA4E;IACpE,oBAAoB,GAAyB,IAAI,CAAC;IAClD,OAAO,GAAG,KAAK,CAAC;IAChB,UAAU,GAAG,KAAK,CAAC;IACnB,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,OAAiC;QAC3C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,wBAAwB,CAAC;QAC/E,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,gCAAgC,CAAC;QACnF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;QACjD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,mBAAmB,CAAC;QAEhE,6EAA6E;QAC7E,qEAAqE;QACrE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAExD,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,0EAA0E;QAC1E,gEAAgE;QAChE,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;IACxE,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;IACnC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;IACvC,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;IAED,2EAA2E;IAC3E,uEAAuE;IACvE,4EAA4E;IAC5E,2EAA2E;IAC3E,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,IAAoB;QAC1B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,qEAAqE;QACrE,0EAA0E;QAC1E,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,WAAW,CAAC,QAA2B;QACrC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjC,sEAAsE;QACtE,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,eAAe,CAAC,OAAgB;QAC9B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,oEAAoE;YACpE,wCAAwC;YACxC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS;gBAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,uEAAuE;YACvE,6CAA6C;YAC7C,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,gBAAgB,CAAC,OAAgB;QAC/B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACrC,0EAA0E;QAC1E,gEAAgE;QAChE,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,2EAA2E;IAC3E,+DAA+D;IAC/D,4EAA4E;IAC5E,0EAA0E;IAC1E,QAAQ;QACN,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC1E,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;YAAE,OAAO;QACpC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,CAAC,EAAE,gCAAgC,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;IAC3B,CAAC;IAED,4EAA4E;IAC5E,yEAAyE;IACzE,wEAAwE;IACxE,qEAAqE;IACrE,kBAAkB;QAChB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACxF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,+DAA+D;YAC/D,8DAA8D;YAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,qEAAqE;QACrE,wEAAwE;QACxE,2EAA2E;QAC3E,iEAAiE;QACjE,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAChC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,wEAAwE;QACxE,uDAAuD;QACvD,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,CAAC,EAAE,oCAAoC,CAAC,CAAC;QACzC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC;IACnC,CAAC;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,6EAA6E;IAC7E,4CAA4C;IACpC,UAAU;QAChB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe;YAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAChF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E,yEAAyE;IACzE,uEAAuE;IACvE,+DAA+D;IACvD,cAAc,CAAC,IAAuB,EAAE,QAA6B;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,sBAAsB,CAAC;QACjE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACrD,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,SAAS;QACf,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC;QACtE,4EAA4E;QAC5E,0EAA0E;QAC1E,4EAA4E;QAC5E,wEAAwE;QACxE,MAAM,eAAe,GAAG,YAAY,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC/D,MAAM,OAAO,GAAG,UAAU,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,eAAe,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;YAC/B,sEAAsE;YACtE,sEAAsE;YACtE,sBAAsB;YACtB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IAEO,sBAAsB;QAC5B,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACpC,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,6EAA6E;IAC7E,yEAAyE;IACzE,uCAAuC;IACvC,cAAc;QACZ,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IAED,uEAAuE;IACvE,gFAAgF;IAChF,0EAA0E;IAC1E,2DAA2D;IAC3D,mBAAmB,CAAC,OAAsB;QACxC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpB,yEAAyE;QACzE,wEAAwE;QACxE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACxC,+DAA+D;YAC/D,sDAAsD;YACtD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC3B,uEAAuE;YACvE,uEAAuE;YACvE,0EAA0E;YAC1E,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,6EAA6E;IAC7E,gFAAgF;IACxE,eAAe;QACrB,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,oBAAoB,CAAC;QACzE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YACtD,IAAI,IAAI,CAAC,oBAAoB,KAAK,OAAO;gBAAE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAC9E,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACxC,sEAAsE;QACtE,4EAA4E;QAC5E,wEAAwE;QACxE,0EAA0E;QAC1E,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YACrE,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;QAChC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,2EAA2E;QAC3E,uEAAuE;QACvE,yEAAyE;QACzE,aAAa;QACb,MAAM,OAAO,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;QACrF,IAAI,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAEO,oBAAoB,CAAC,MAA4B;QACvD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,qEAAqE;QACrE,+EAA+E;QAC/E,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;YAAE,OAAO;QACvC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,uEAAuE;YACvE,uEAAuE;YACvE,yEAAyE;YACzE,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,qEAAqE;QACrE,qEAAqE;QACrE,yEAAyE;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9B,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;IAC9B,CAAC;IAEO,mBAAmB,CAAC,MAA4B;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACxC,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,uCAAuC,CAAC;QACvE,wEAAwE;QACxE,sEAAsE;QACtE,sEAAsE;QACtE,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,uCAAuC,CAAC;QACpE,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,uCAAuC,CAAC;QAC3F,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI;YAAE,OAAO,uCAAuC,CAAC;QACnF,0EAA0E;QAC1E,2EAA2E;QAC3E,4EAA4E;QAC5E,2EAA2E;QAC3E,uEAAuE;QACvE,iDAAiD;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;QAC7C,IAAI,SAAS,IAAI,CAAC;YAAE,OAAO,uCAAuC,CAAC;QACnE,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC;QACjD,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;QAC7E,MAAM,WAAW,GAAG,cAAc,GAAG,qCAAqC,CAAC;QAC3E,OAAO,IAAI,CAAC,GAAG,CACb,uCAAuC,EACvC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,uCAAuC,CAAC,CAC/D,CAAC;IACJ,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YAC/B,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC1E,6EAA6E;QAC7E,gEAAgE;QAChE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACpC,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,IAAI,cAAc,GAAkB,IAAI,CAAC;YACzC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,wEAAwE;gBACxE,sEAAsE;gBACtE,iEAAiE;gBACjE,mEAAmE;gBACnE,wEAAwE;gBACxE,6CAA6C;gBAC7C,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACrD,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;oBAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAChD,cAAc,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACnE,CAAC;gBACD,IAAI,cAAc,EAAE,CAAC;oBACnB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;wBACvB,aAAa,GAAG,IAAI,CAAC;oBACvB,CAAC;yBAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBAClC,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,oCAAoC,CAAC,CAAC;oBACrF,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO;YACvD,0EAA0E;YAC1E,qEAAqE;YACrE,2EAA2E;YAC3E,2EAA2E;YAC3E,wEAAwE;YACxE,wBAAwB;YACxB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,aAAa,IAAI,UAAU,CAAC;YACzC,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC;YACvC,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC;YACzC,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC;YAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,2EAA2E;YAC3E,yEAAyE;YACzE,iEAAiE;YACjE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;YAChD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;YACjC,uEAAuE;YACvE,wEAAwE;YACxE,0EAA0E;YAC1E,sEAAsE;YACtE,4EAA4E;YAC5E,yDAAyD;YACzD,IACE,IAAI,KAAK,cAAc;gBACvB,IAAI,CAAC,WAAW,KAAK,eAAe;gBACpC,IAAI,CAAC,cAAc,KAAK,kBAAkB,EAC1C,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,UAAU,EAAE,CAAC;gBACf,sEAAsE;gBACtE,oEAAoE;gBACpE,uEAAuE;gBACvE,4CAA4C;gBAC5C,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,CAAC;YACD,sEAAsE;YACtE,wEAAwE;YACxE,qEAAqE;YACrE,0EAA0E;YAC1E,mCAAmC;YACnC,IAAI,IAAI,CAAC,YAAY,IAAI,aAAa,IAAI,CAAC,UAAU,EAAE,CAAC;gBACtD,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACtC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,4BAA4B;QAClC,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI;YAAE,OAAO;QAC5C,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,CAAC,EAAE,oCAAoC,CAAC,CAAC;QACzC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"caffeinate-manager.js","sourceRoot":"","sources":["../src/caffeinate-manager.ts"],"names":[],"mappings":"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"}