instar 1.3.581 → 1.3.583
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.
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +3 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/core/PreferencesManager.d.ts +19 -0
- package/dist/core/PreferencesManager.d.ts.map +1 -1
- package/dist/core/PreferencesManager.js +25 -1
- package/dist/core/PreferencesManager.js.map +1 -1
- package/dist/core/SleepWakeDetector.d.ts +39 -0
- package/dist/core/SleepWakeDetector.d.ts.map +1 -1
- package/dist/core/SleepWakeDetector.js +52 -0
- package/dist/core/SleepWakeDetector.js.map +1 -1
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/ws2SendWiring.d.ts +5 -3
- package/dist/core/ws2SendWiring.d.ts.map +1 -1
- package/dist/core/ws2SendWiring.js +7 -6
- package/dist/core/ws2SendWiring.js.map +1 -1
- package/dist/server/AgentServer.d.ts +3 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +1 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +4 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +11 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +47 -47
- package/upgrades/1.3.582.md +47 -0
- package/upgrades/1.3.583.md +51 -0
- package/upgrades/side-effects/sleepwake-recurring-drift-guard.md +46 -0
- package/upgrades/side-effects/ws2-send-3-preferences.md +50 -0
|
@@ -116,10 +116,29 @@ export interface RecordPreferenceOptions {
|
|
|
116
116
|
* authoritative instruction (spec §3.6).
|
|
117
117
|
*/
|
|
118
118
|
export declare function formatPreferencesForSessionStart(store: PreferencesStore, maxBytes?: number): string;
|
|
119
|
+
/**
|
|
120
|
+
* WS2.1 preferences-record replication emit seam (injected, dark by default). server.ts
|
|
121
|
+
* constructs the journal/clock AFTER the manager, so this is late-bound. PUT-ONLY by
|
|
122
|
+
* construction — recordPreference is the only writer and it upserts (keyed on dedupeKey);
|
|
123
|
+
* there is no delete path, so there is no emitDelete. Absent ⇒ strict single-machine no-op.
|
|
124
|
+
*/
|
|
125
|
+
export interface PreferenceReplicationEmitter {
|
|
126
|
+
/** Emit a `put` for a freshly upserted preference entry (called from recordPreference). */
|
|
127
|
+
emitPut(entry: PreferenceEntry): void;
|
|
128
|
+
}
|
|
119
129
|
export declare class PreferencesManager {
|
|
120
130
|
private stateDir;
|
|
121
131
|
private preferencesPath;
|
|
132
|
+
/** WS2.1 preferences-record replication emitter (injected, dark by default). Absent ⇒ no-op. */
|
|
133
|
+
private replication;
|
|
122
134
|
constructor(stateDir: string);
|
|
135
|
+
/**
|
|
136
|
+
* Late-bind the WS2.1 preferences-record replication emitter (server.ts constructs the
|
|
137
|
+
* journal/clock AFTER the manager). Idempotent; passing undefined/null detaches (back to
|
|
138
|
+
* single-machine no-op). The emit funnel checks `this.replication` per write, so attaching
|
|
139
|
+
* mid-life takes effect on the next recordPreference.
|
|
140
|
+
*/
|
|
141
|
+
setReplicationEmitter(emitter: PreferenceReplicationEmitter | null | undefined): void;
|
|
123
142
|
/** Absolute path to the backing file (for tests / observability). */
|
|
124
143
|
getPath(): string;
|
|
125
144
|
/** Whether the backing file exists on disk. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreferencesManager.d.ts","sourceRoot":"","sources":["../../src/core/PreferencesManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,yEAAyE;AACzE,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAErD,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,UAAU,EAAE,oBAAoB,CAAC;IACjC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,8CAA8C;AAC9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wCAAwC;AACxC,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA6BD;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,gBAAgB,EACvB,QAAQ,SAAO,GACd,MAAM,CAmBR;AAID,qBAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"PreferencesManager.d.ts","sourceRoot":"","sources":["../../src/core/PreferencesManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAQH,yEAAyE;AACzE,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAErD,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,UAAU,EAAE,oBAAoB,CAAC;IACjC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,8CAA8C;AAC9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wCAAwC;AACxC,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA6BD;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,gBAAgB,EACvB,QAAQ,SAAO,GACd,MAAM,CAmBR;AAID;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,2FAA2F;IAC3F,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CACvC;AAED,qBAAa,kBAAkB;IAMjB,OAAO,CAAC,QAAQ;IAL5B,OAAO,CAAC,eAAe,CAAS;IAEhC,gGAAgG;IAChG,OAAO,CAAC,WAAW,CAA6C;gBAE5C,QAAQ,EAAE,MAAM;IAIpC;;;;;OAKG;IACH,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAIrF,qEAAqE;IACrE,OAAO,IAAI,MAAM;IAIjB,+CAA+C;IAC/C,MAAM,IAAI,OAAO;IAIjB;;;;OAIG;IACH,IAAI,IAAI,gBAAgB;IAqExB;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,EAAE,KAAK,GAAE,uBAA4B,GAAG,eAAe;IA4ExG;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,SAAO,GAAG;QAC/B,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf;IAUD,gDAAgD;IAChD,OAAO,CAAC,WAAW;IAiCnB;;;;OAIG;IACH,oBAAoB,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE;IAQvE;;;;OAIG;IACH,aAAa,IAAI,eAAe,EAAE;CAGnC"}
|
|
@@ -85,14 +85,24 @@ export function formatPreferencesForSessionStart(store, maxBytes = 4000) {
|
|
|
85
85
|
return '';
|
|
86
86
|
return [header, intro, '', ...bodyLines, footer].join('\n');
|
|
87
87
|
}
|
|
88
|
-
// ── Main Class ───────────────────────────────────────────────────────
|
|
89
88
|
export class PreferencesManager {
|
|
90
89
|
stateDir;
|
|
91
90
|
preferencesPath;
|
|
91
|
+
/** WS2.1 preferences-record replication emitter (injected, dark by default). Absent ⇒ no-op. */
|
|
92
|
+
replication = null;
|
|
92
93
|
constructor(stateDir) {
|
|
93
94
|
this.stateDir = stateDir;
|
|
94
95
|
this.preferencesPath = path.join(stateDir, 'preferences.json');
|
|
95
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Late-bind the WS2.1 preferences-record replication emitter (server.ts constructs the
|
|
99
|
+
* journal/clock AFTER the manager). Idempotent; passing undefined/null detaches (back to
|
|
100
|
+
* single-machine no-op). The emit funnel checks `this.replication` per write, so attaching
|
|
101
|
+
* mid-life takes effect on the next recordPreference.
|
|
102
|
+
*/
|
|
103
|
+
setReplicationEmitter(emitter) {
|
|
104
|
+
this.replication = emitter ?? null;
|
|
105
|
+
}
|
|
96
106
|
/** Absolute path to the backing file (for tests / observability). */
|
|
97
107
|
getPath() {
|
|
98
108
|
return this.preferencesPath;
|
|
@@ -240,6 +250,20 @@ export class PreferencesManager {
|
|
|
240
250
|
result.lastMutatedSeq = nextSeq;
|
|
241
251
|
store.schemaVersion = PREFERENCES_SCHEMA_VERSION;
|
|
242
252
|
this.writeAtomic(store);
|
|
253
|
+
// WS2.1 — best-effort preferences-record replication emission (dark by default; the
|
|
254
|
+
// emitter is only injected when multiMachine.stateSync.preferences.enabled is true).
|
|
255
|
+
// PUT-ONLY: recordPreference is the sole writer and upserts on dedupeKey, so a put on
|
|
256
|
+
// the upserted entry carries the latest state (a peer SEES the refreshed learning +
|
|
257
|
+
// bumped confidence). The emitter swallows its own errors, but we wrap defensively so a
|
|
258
|
+
// replication fault can NEVER break or roll back a local preference write — the durable
|
|
259
|
+
// on-disk state is already persisted above.
|
|
260
|
+
try {
|
|
261
|
+
this.replication?.emitPut(result);
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// @silent-fallback-ok: replication is best-effort and must never break the local write.
|
|
265
|
+
// The emitter counts its own failures internally.
|
|
266
|
+
}
|
|
243
267
|
return result;
|
|
244
268
|
}
|
|
245
269
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreferencesManager.js","sourceRoot":"","sources":["../../src/core/PreferencesManager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PreferencesManager.js","sourceRoot":"","sources":["../../src/core/PreferencesManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,25 @@
|
|
|
30
30
|
* On top of classification, a `minWakeIntervalMs` cooldown caps the emit rate so
|
|
31
31
|
* even a misclassified burst can't trigger a recovery storm.
|
|
32
32
|
*
|
|
33
|
+
* ## Recurring-drift guard for the MODERATE-load band (2026-06-15)
|
|
34
|
+
*
|
|
35
|
+
* The load guard (`maxLoadRatio`, default 1.5) and the consecutive-drift burst floor
|
|
36
|
+
* together miss one real cascade: a host oversubscribed only MODERATELY — load just
|
|
37
|
+
* above 1.0/core but below `maxLoadRatio` — stalls its event loop for tens of seconds
|
|
38
|
+
* *intermittently*, ~every couple of minutes. Because on-time ticks fall between those
|
|
39
|
+
* drifts, the consecutive counter resets (so the burst floor never trips), and because
|
|
40
|
+
* the 1-minute `loadavg[0]` sits below 1.5, the load guard never trips either. Each
|
|
41
|
+
* isolated drift then emits a FALSE wake, and the ~2-minute cadence outlasts the
|
|
42
|
+
* `minWakeIntervalMs` cooldown — the 2026-06-15 multi-machine cascade (loadRatio ~1.1/core,
|
|
43
|
+
* `Wake detected after ~33s sleep` roughly every 2 minutes while the host was in use).
|
|
44
|
+
*
|
|
45
|
+
* The recurring-drift guard closes that band: a SHORT drift within `recentDriftWindowMs`
|
|
46
|
+
* of a PRIOR short drift, while `loadRatio > recentDriftLoadFloor`, is recurring
|
|
47
|
+
* starvation and is suppressed — generalizing the burst floor from *consecutive* ticks
|
|
48
|
+
* to *recent* ticks. A genuine isolated sleep (no recent prior drift) and any drift on a
|
|
49
|
+
* lightly-loaded host (ratio <= the floor) are unaffected and still emit; long sleeps are
|
|
50
|
+
* always exempt. Set `recentDriftWindowMs: 0` to disable.
|
|
51
|
+
*
|
|
33
52
|
* Suppressed events are NOT added to `wakeHistory`, so `getCumulativeSleepMsBetween`
|
|
34
53
|
* (the wake-reaper's sleep-credit source) only ever counts genuine sleep.
|
|
35
54
|
*/
|
|
@@ -65,6 +84,20 @@ export interface SleepWakeDetectorConfig {
|
|
|
65
84
|
* (the 2nd consecutive drift is already a storm). Set 0 to disable.
|
|
66
85
|
*/
|
|
67
86
|
driftBurstSuppressFloor?: number;
|
|
87
|
+
/**
|
|
88
|
+
* A SHORT drift within this window (ms) of a PRIOR short drift, while
|
|
89
|
+
* `loadRatio > recentDriftLoadFloor`, is treated as recurring CPU starvation and
|
|
90
|
+
* suppressed — closing the moderate-load band (above the floor, below `maxLoadRatio`)
|
|
91
|
+
* where intermittent drifts dodge BOTH the load guard and the consecutive burst floor.
|
|
92
|
+
* Default: 300000 (5 min). Set 0 to disable.
|
|
93
|
+
*/
|
|
94
|
+
recentDriftWindowMs?: number;
|
|
95
|
+
/**
|
|
96
|
+
* `loadavg[0] / cpuCount` above which the recurring-drift guard applies. At or below
|
|
97
|
+
* this the host is not oversubscribed, so a recurring short drift is trusted as a real
|
|
98
|
+
* brief sleep and still emits. Default: 1.0.
|
|
99
|
+
*/
|
|
100
|
+
recentDriftLoadFloor?: number;
|
|
68
101
|
/** Injectable system-load source (testing). Default: os.loadavg. */
|
|
69
102
|
loadAvgProvider?: () => number[];
|
|
70
103
|
/** Injectable CPU-count source (testing). Default: os.cpus().length. */
|
|
@@ -103,6 +136,12 @@ export declare class SleepWakeDetector extends EventEmitter {
|
|
|
103
136
|
private longSleepFloorSeconds;
|
|
104
137
|
private minWakeIntervalMs;
|
|
105
138
|
private driftBurstSuppressFloor;
|
|
139
|
+
private recentDriftWindowMs;
|
|
140
|
+
private recentDriftLoadFloor;
|
|
141
|
+
/** Wall-clock (ms) of the most recent SHORT drift, emitted or suppressed. Drives the
|
|
142
|
+
* recurring-drift guard: a fresh short drift within `recentDriftWindowMs` of this,
|
|
143
|
+
* under elevated load, is recurring starvation. Null until the first short drift. */
|
|
144
|
+
private lastShortDriftAtMs;
|
|
106
145
|
/** Count of BACK-TO-BACK drift ticks (reset by any on-time tick). A real sleep is
|
|
107
146
|
* ONE isolated drift; sustained CPU starvation produces consecutive drifts. The
|
|
108
147
|
* Nth+ consecutive drift is a storm, not a sleep, and is suppressed regardless of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SleepWakeDetector.d.ts","sourceRoot":"","sources":["../../src/core/SleepWakeDetector.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"SleepWakeDetector.d.ts","sourceRoot":"","sources":["../../src/core/SleepWakeDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,25 @@
|
|
|
30
30
|
* On top of classification, a `minWakeIntervalMs` cooldown caps the emit rate so
|
|
31
31
|
* even a misclassified burst can't trigger a recovery storm.
|
|
32
32
|
*
|
|
33
|
+
* ## Recurring-drift guard for the MODERATE-load band (2026-06-15)
|
|
34
|
+
*
|
|
35
|
+
* The load guard (`maxLoadRatio`, default 1.5) and the consecutive-drift burst floor
|
|
36
|
+
* together miss one real cascade: a host oversubscribed only MODERATELY — load just
|
|
37
|
+
* above 1.0/core but below `maxLoadRatio` — stalls its event loop for tens of seconds
|
|
38
|
+
* *intermittently*, ~every couple of minutes. Because on-time ticks fall between those
|
|
39
|
+
* drifts, the consecutive counter resets (so the burst floor never trips), and because
|
|
40
|
+
* the 1-minute `loadavg[0]` sits below 1.5, the load guard never trips either. Each
|
|
41
|
+
* isolated drift then emits a FALSE wake, and the ~2-minute cadence outlasts the
|
|
42
|
+
* `minWakeIntervalMs` cooldown — the 2026-06-15 multi-machine cascade (loadRatio ~1.1/core,
|
|
43
|
+
* `Wake detected after ~33s sleep` roughly every 2 minutes while the host was in use).
|
|
44
|
+
*
|
|
45
|
+
* The recurring-drift guard closes that band: a SHORT drift within `recentDriftWindowMs`
|
|
46
|
+
* of a PRIOR short drift, while `loadRatio > recentDriftLoadFloor`, is recurring
|
|
47
|
+
* starvation and is suppressed — generalizing the burst floor from *consecutive* ticks
|
|
48
|
+
* to *recent* ticks. A genuine isolated sleep (no recent prior drift) and any drift on a
|
|
49
|
+
* lightly-loaded host (ratio <= the floor) are unaffected and still emit; long sleeps are
|
|
50
|
+
* always exempt. Set `recentDriftWindowMs: 0` to disable.
|
|
51
|
+
*
|
|
33
52
|
* Suppressed events are NOT added to `wakeHistory`, so `getCumulativeSleepMsBetween`
|
|
34
53
|
* (the wake-reaper's sleep-credit source) only ever counts genuine sleep.
|
|
35
54
|
*/
|
|
@@ -45,6 +64,12 @@ export class SleepWakeDetector extends EventEmitter {
|
|
|
45
64
|
longSleepFloorSeconds;
|
|
46
65
|
minWakeIntervalMs;
|
|
47
66
|
driftBurstSuppressFloor;
|
|
67
|
+
recentDriftWindowMs;
|
|
68
|
+
recentDriftLoadFloor;
|
|
69
|
+
/** Wall-clock (ms) of the most recent SHORT drift, emitted or suppressed. Drives the
|
|
70
|
+
* recurring-drift guard: a fresh short drift within `recentDriftWindowMs` of this,
|
|
71
|
+
* under elevated load, is recurring starvation. Null until the first short drift. */
|
|
72
|
+
lastShortDriftAtMs = null;
|
|
48
73
|
/** Count of BACK-TO-BACK drift ticks (reset by any on-time tick). A real sleep is
|
|
49
74
|
* ONE isolated drift; sustained CPU starvation produces consecutive drifts. The
|
|
50
75
|
* Nth+ consecutive drift is a storm, not a sleep, and is suppressed regardless of
|
|
@@ -65,6 +90,8 @@ export class SleepWakeDetector extends EventEmitter {
|
|
|
65
90
|
this.longSleepFloorSeconds = config.longSleepFloorSeconds ?? 300;
|
|
66
91
|
this.minWakeIntervalMs = config.minWakeIntervalMs ?? 60000;
|
|
67
92
|
this.driftBurstSuppressFloor = config.driftBurstSuppressFloor ?? 2;
|
|
93
|
+
this.recentDriftWindowMs = config.recentDriftWindowMs ?? 300000;
|
|
94
|
+
this.recentDriftLoadFloor = config.recentDriftLoadFloor ?? 1.0;
|
|
68
95
|
this.loadAvgProvider = config.loadAvgProvider ?? (() => os.loadavg());
|
|
69
96
|
this.cpuCountProvider = config.cpuCountProvider ?? (() => os.cpus().length);
|
|
70
97
|
this.now = config.nowProvider ?? (() => Date.now());
|
|
@@ -86,6 +113,11 @@ export class SleepWakeDetector extends EventEmitter {
|
|
|
86
113
|
const isLongSleep = sleepDuration >= this.longSleepFloorSeconds;
|
|
87
114
|
const loadRatio = this.currentLoadRatio();
|
|
88
115
|
this.consecutiveDrifts += 1;
|
|
116
|
+
// Record every SHORT drift's time (emitted or suppressed) so the recurring-drift
|
|
117
|
+
// guard below can measure recurrence; capture the prior value first for the check.
|
|
118
|
+
const prevShortDriftAtMs = this.lastShortDriftAtMs;
|
|
119
|
+
if (!isLongSleep)
|
|
120
|
+
this.lastShortDriftAtMs = now;
|
|
89
121
|
// Consecutive-drift burst = sustained CPU starvation, not sleep. A genuine sleep
|
|
90
122
|
// is ONE isolated drift (the next on-time tick resets the counter); the 2nd+
|
|
91
123
|
// back-to-back SHORT drift is a storm. Suppress it regardless of the (lagging,
|
|
@@ -107,6 +139,26 @@ export class SleepWakeDetector extends EventEmitter {
|
|
|
107
139
|
`(> ${this.maxLoadRatio}) — treating as CPU starvation, suppressing wake`);
|
|
108
140
|
return;
|
|
109
141
|
}
|
|
142
|
+
// Recurring short drift under MODERATE load (the band the two guards above miss):
|
|
143
|
+
// a short drift within recentDriftWindowMs of a PRIOR short drift, while load is
|
|
144
|
+
// above recentDriftLoadFloor (oversubscribed) but below maxLoadRatio, is recurring
|
|
145
|
+
// CPU starvation — the 2026-06-15 cascade where loadRatio sat ~1.1/core (under the
|
|
146
|
+
// 1.5 hard guard) yet the loop stalled every ~2min, and on-time ticks between the
|
|
147
|
+
// drifts reset the consecutive counter so the burst floor never tripped. A genuine
|
|
148
|
+
// isolated sleep (no recent prior drift) and any drift on a lightly-loaded host
|
|
149
|
+
// (ratio <= floor) still emit; long sleeps are exempt (handled above).
|
|
150
|
+
if (!isLongSleep &&
|
|
151
|
+
this.recentDriftWindowMs > 0 &&
|
|
152
|
+
loadRatio > this.recentDriftLoadFloor &&
|
|
153
|
+
prevShortDriftAtMs !== null &&
|
|
154
|
+
now - prevShortDriftAtMs < this.recentDriftWindowMs) {
|
|
155
|
+
this.recordSuppression('cpu-starvation', sleepDuration, loadRatio, now);
|
|
156
|
+
console.warn(`[SleepWakeDetector] Recurring short drift ~${sleepDuration}s within ` +
|
|
157
|
+
`${this.recentDriftWindowMs}ms of a prior short drift at load ratio ` +
|
|
158
|
+
`${loadRatio.toFixed(2)} (> ${this.recentDriftLoadFloor}) — recurring CPU ` +
|
|
159
|
+
`starvation, suppressing wake`);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
110
162
|
// Rate-limit emitted wakes so even a misclassified burst can't storm
|
|
111
163
|
// recovery. Long sleeps bypass the cooldown — recovery there is essential.
|
|
112
164
|
if (!isLongSleep &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SleepWakeDetector.js","sourceRoot":"","sources":["../../src/core/SleepWakeDetector.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"SleepWakeDetector.js","sourceRoot":"","sources":["../../src/core/SleepWakeDetector.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -3987,6 +3987,16 @@ export interface MonitoringConfig {
|
|
|
3987
3987
|
/** Minimum gap (ms) between EMITTED wakes; short drifts within it are
|
|
3988
3988
|
* rate-limited. Long sleeps bypass it. Default: 60000. */
|
|
3989
3989
|
minWakeIntervalMs?: number;
|
|
3990
|
+
/** A SHORT drift within this window (ms) of a PRIOR short drift, while load is
|
|
3991
|
+
* above `recentDriftLoadFloor`, is treated as recurring CPU starvation and
|
|
3992
|
+
* suppressed — catching the moderate-load band (below `maxLoadRatio`) where
|
|
3993
|
+
* isolated drifts dodge the consecutive burst floor. Default: 300000 (5 min).
|
|
3994
|
+
* Set 0 to disable this guard. */
|
|
3995
|
+
recentDriftWindowMs?: number;
|
|
3996
|
+
/** loadavg[0]/cpuCount above which the recent-drift recurrence guard applies.
|
|
3997
|
+
* Below this, a recurring short drift is trusted as a real brief sleep. Default:
|
|
3998
|
+
* 1.0 (the oversubscription threshold; the host has more runnable work than cores). */
|
|
3999
|
+
recentDriftLoadFloor?: number;
|
|
3990
4000
|
};
|
|
3991
4001
|
/**
|
|
3992
4002
|
* SessionReaper — pressure-aware reaper of idle-but-alive sessions. The only
|