Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
40fac3f
fix(coding-agent): avoid retrying delivered agent messages
snimu Aug 24, 2026
980d22d
Add the changelog fragment
snimu Aug 24, 2026
4d9aa20
fix(coding-agent): remove blanket RPC timeouts
snimu Aug 24, 2026
8e57ca7
fix(coding-agent): trust supervised session renames
snimu Aug 24, 2026
6fd14f2
fix(coding-agent): align RPC child lifecycle
snimu Aug 24, 2026
7369191
fix(coding-agent): single-source interactive queue state
snimu Aug 24, 2026
c38d47e
Merge remote-message-single-send into the stack
snimu Aug 24, 2026
a7e26e6
Merge remove-rpc-blanket-timeouts into the stack
snimu Aug 24, 2026
8ba6695
Merge supervised-rename-authority into the stack
snimu Aug 24, 2026
3881a53
fix(coding-agent): preserve queue selection after moves
snimu Aug 24, 2026
8891bfa
fix(coding-agent): cancel final snapshot before disposal
snimu Aug 24, 2026
ee720c8
Merge tui-queue-single-source into the stack
snimu Aug 24, 2026
0bb6e44
fix(coding-agent): reject failed RPC prompts
snimu Aug 24, 2026
1ed6add
Merge remove-rpc-blanket-timeouts (prompt-failure fix) into the stack
snimu Aug 24, 2026
cf8fda3
fix(coding-agent): rely on queue events after mutations
snimu Aug 24, 2026
b4ad907
Merge supervised-rename-authority (stack update) into the stack
snimu Aug 24, 2026
d0f9438
Merge tui-queue-single-source (comment fixes) into the stack
snimu Aug 24, 2026
bf98b51
test(coding-agent): update resync queue display harness
snimu Aug 24, 2026
b6b98ef
Merge tui-queue-single-source (resync test fix) into the stack
snimu Aug 24, 2026
3836e61
test(coding-agent): update snapshot queue display seams
snimu Aug 24, 2026
4d11b97
Merge tui-queue-single-source (status test seams) into the stack
snimu Aug 24, 2026
0f70c78
fix(coding-agent): bound snapshot queue wait during teardown
snimu Aug 24, 2026
0338d32
fix(coding-agent): reconcile queue browsing on events
snimu Aug 24, 2026
f34b713
fix(coding-agent): cancel failed RPC event waits
snimu Aug 24, 2026
f504c64
Merge remove-rpc-blanket-timeouts (waiter cleanup) into the stack
snimu Aug 24, 2026
0519888
Merge supervised-rename-authority (waiter cleanup) into the stack
snimu Aug 24, 2026
ce60aac
test(coding-agent): cover final snapshot execution timeout
snimu Aug 24, 2026
a8e4997
Merge tui-queue-single-source (event reconciliation) into the stack
snimu Aug 24, 2026
7e4f95a
fix(coding-agent): serialize post-compaction continuation
snimu Aug 24, 2026
4a67ea2
Merge branch 'snimu/kernel-snapshot-dispose-timeout' into snimu/post-…
snimu Aug 24, 2026
5c9cb24
test(coding-agent): await post-compaction retry settlement
snimu Aug 24, 2026
93bb548
test(coding-agent): avoid retry call-order assumptions
snimu Aug 24, 2026
8449cb2
fix(coding-agent): guard stale continuation retry
snimu Aug 24, 2026
3162143
fix(coding-agent): preserve paused compaction continuations
snimu Aug 24, 2026
34f36d9
Merge remote-tracking branch 'origin/main' into snimu/remote-message-…
snimu Aug 26, 2026
d9e1a86
Merge branch 'snimu/remote-message-single-send' into snimu/remove-rpc…
snimu Aug 26, 2026
1ff8125
Merge branch 'snimu/remove-rpc-blanket-timeouts' into snimu/supervise…
snimu Aug 26, 2026
d4d6e52
Merge branch 'snimu/supervised-rename-authority' into snimu/tui-queue…
snimu Aug 26, 2026
304ef0e
Merge branch 'snimu/tui-queue-single-source' into snimu/kernel-snapsh…
snimu Aug 26, 2026
e3aefdd
Merge branch 'snimu/kernel-snapshot-dispose-timeout' into snimu/post-…
snimu Aug 26, 2026
938b0a7
fix(coding-agent): retain queued edit after lost move
snimu Aug 26, 2026
8bacbec
Merge branch 'snimu/tui-queue-single-source' into snimu/kernel-snapsh…
snimu Aug 26, 2026
b18f772
Merge branch 'snimu/kernel-snapshot-dispose-timeout' into snimu/post-…
snimu Aug 26, 2026
29e994a
Merge remote-tracking branch 'origin/main' into snimu/remote-message-…
snimu Aug 27, 2026
6eb14d8
Merge branch 'snimu/remote-message-single-send' into snimu/remove-rpc…
snimu Aug 27, 2026
1cb0f22
Merge branch 'snimu/remove-rpc-blanket-timeouts' into snimu/supervise…
snimu Aug 27, 2026
384a702
Merge branch 'snimu/supervised-rename-authority' into snimu/tui-queue…
snimu Aug 27, 2026
c148b4d
Merge branch 'snimu/tui-queue-single-source' into snimu/kernel-snapsh…
snimu Aug 27, 2026
e7b00bc
fix(coding-agent): bound REPL snapshot disposal
snimu Aug 27, 2026
3c7ffc1
Merge branch 'snimu/kernel-snapshot-dispose-timeout' into snimu/post-…
snimu Aug 27, 2026
5ad43a1
fix(coding-agent): await active compaction continuation barrier
snimu Aug 27, 2026
20c2482
fix(coding-agent): reconcile queue selection after snapshots
snimu Aug 27, 2026
35d4433
Merge branch 'snimu/tui-queue-single-source' into snimu/kernel-snapsh…
snimu Aug 27, 2026
ed169d3
Merge branch 'snimu/kernel-snapshot-dispose-timeout' into snimu/post-…
snimu Aug 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Fixed graceful Python kernel disposal so timed-out final snapshots are cancelled before teardown.
1 change: 1 addition & 0 deletions packages/coding-agent/.changes/post-compaction-idle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Removed the delay before continuing sessions after compaction.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Fixed remote agent messages being delivered twice when the daemon request timed out or the response was lost: the message is now sent exactly once per call, and post-send failures surface as errors instead of triggering a resend.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Allowed long-running RPC commands and agent turns to complete without fixed client timeouts.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Fixed queued-message editing so duplicate prompts always target the selected queue entry.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Fixed supervised session renames failing after the supervisor approved an available name.
172 changes: 109 additions & 63 deletions packages/coding-agent/src/core/agent-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -830,11 +830,12 @@ function createAgentMessageDeferred(): AgentMessageDeferred {

/** One-shot settlement for a scheduled post-compaction continuation; a settled failure is never re-exposed to later waiters. */
interface PostCompactionContinuationSettlement extends AgentMessageDeferred {
continueAfterSessionInput: boolean;
settled: boolean;
}

function createPostCompactionContinuationSettlement(): PostCompactionContinuationSettlement {
return { ...createAgentMessageDeferred(), settled: false };
return { ...createAgentMessageDeferred(), continueAfterSessionInput: false, settled: false };
}

export interface ModelCycleResult {
Expand Down Expand Up @@ -1198,7 +1199,6 @@ export class AgentSession {
private _compactAutoRefinePending = false;
private _turnIntervalAutoRefinePending = false;
private _postCompactionContinuationScheduled = false;
private _postCompactionContinuationTimer: ReturnType<typeof setTimeout> | undefined;
private _postCompactionContinuationSettlement: PostCompactionContinuationSettlement | undefined;
private _postCompactionContinuationMessages: AgentMessage[] = [];
private _scheduledPostCompactionContinuationMessages: AgentMessage[] = [];
Expand Down Expand Up @@ -7311,6 +7311,7 @@ export class AgentSession {
throw new Error("Cannot compact without aborting while the agent is running.");
}
const hadPostCompactionContinue = this._postCompactionContinuationScheduled;
const continueAfterSessionInput = this._postCompactionContinuationSettlement?.continueAfterSessionInput ?? false;
this._disconnectFromAgent();
if (!options.skipAbort) await this.abort();
let didCompact = false;
Expand Down Expand Up @@ -7379,7 +7380,7 @@ export class AgentSession {
if (didCompact) {
this._discardPendingAutoRefine({ cancelPostCompactionContinue: true });
if (hadPostCompactionContinue) {
this._schedulePostCompactionContinue();
this._schedulePostCompactionContinue(continueAfterSessionInput);
}
// Queued agent or session-owned inputs resume the loop; defer refine
// behind them instead of interleaving it before their turns.
Expand Down Expand Up @@ -7498,7 +7499,7 @@ export class AgentSession {
}

private _settlePostCompactionContinue(error?: Error): void {
if (!error && (this._postCompactionContinuationScheduled || this._postCompactionContinuationTimer)) return;
if (!error && this._postCompactionContinuationScheduled) return;
const settlement = this._postCompactionContinuationSettlement;
if (!settlement || settlement.settled) return;
settlement.settled = true;
Expand All @@ -7508,10 +7509,6 @@ export class AgentSession {
}

private _cancelPostCompactionContinue(): void {
if (this._postCompactionContinuationTimer) {
clearTimeout(this._postCompactionContinuationTimer);
this._postCompactionContinuationTimer = undefined;
}
this._postCompactionContinuationScheduled = false;
this._scheduledPostCompactionContinuationMessages = [];
this._settlePostCompactionContinue();
Expand Down Expand Up @@ -7607,75 +7604,124 @@ export class AgentSession {
this._scheduleAutoRefine("compact");
}

private _schedulePostCompactionContinue(): void {
if (this._postCompactionContinuationScheduled) {
return;
}
private _schedulePostCompactionContinue(continueAfterSessionInput = false): void {
if (!this._postCompactionContinuationSettlement || this._postCompactionContinuationSettlement.settled) {
this._postCompactionContinuationSettlement = createPostCompactionContinuationSettlement();
}
const settlement = this._postCompactionContinuationSettlement;
settlement.continueAfterSessionInput ||= continueAfterSessionInput;
if (this._postCompactionContinuationScheduled) {
return;
}
this._postCompactionContinuationScheduled = true;
this._scheduledPostCompactionContinuationMessages = [...this._postCompactionContinuationMessages];
this._postCompactionContinuationTimer = setTimeout(() => {
this._postCompactionContinuationTimer = undefined;
void this._runScheduledPostCompactionContinue()
.catch(() => undefined)
.finally(() => this._settlePostCompactionContinue());
}, 100);
void this._runScheduledPostCompactionContinue(settlement)
.catch(() => undefined)
.finally(() => {
if (this._postCompactionContinuationSettlement === settlement) {
this._settlePostCompactionContinue();
}
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Continuation identity reused across runners

High Severity

_schedulePostCompactionContinue reuses an unsettled settlement whenever _postCompactionContinuationScheduled is already false, and that flag is cleared before agent.continue() finishes. A later schedule (including auto-compaction during that same run) therefore starts a second runner on the same settlement, so identity checks cannot tell the stale runner from the new one. The first runner can still forget continuation messages or reject the shared settlement, which drops the follow-up turn or fails headless idle waiters.

Additional Locations (2)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit ed169d3. Configure here.

}

private _sessionOwnsScheduledContinuations(continuationMessages: AgentMessage[]): boolean {
return continuationMessages.some((message) => this._postCompactionContinuationMessages.includes(message));
}

private async _runScheduledPostCompactionContinue(): Promise<void> {
await this._waitForRefineIdle();
if (!this._postCompactionContinuationScheduled) {
return;
}
if (this.isStreaming || this.isCompacting || this.isRetrying || this._queuedWorkPauses.size > 0) {
this._postCompactionContinuationScheduled = false;
this._schedulePostCompactionContinue();
return;
private async _waitForQueuedWorkResume(settlement: PostCompactionContinuationSettlement): Promise<void> {
while (this._queuedWorkPauses.size > 0 && this._postCompactionContinuationSettlement === settlement) {
let resume = () => {};
const resumed = new Promise<void>((resolve) => {
resume = resolve;
this._sessionInputCheckpointWaiters.add(resolve);
});
try {
await Promise.race([resumed, settlement.promise]);
} finally {
this._sessionInputCheckpointWaiters.delete(resume);
}
}
}

const continuationMessages = [...this._scheduledPostCompactionContinuationMessages];
if (continuationMessages.length > 0 && !this._sessionOwnsScheduledContinuations(continuationMessages)) {
this._cancelPostCompactionContinue();
this._scheduleAutoRefineAfterAgentEnd();
return;
}
// An empty queue is not idle while the scheduler still owns active work.
if (this.unfinishedActionCount > 0 || this._sessionInputPumpRequested) {
this._scheduleSessionInputPump();
await this._sessionInputPump;
if (this._postCompactionContinuationScheduled) {
this._postCompactionContinuationScheduled = false;
const shouldReschedule =
continuationMessages.length === 0
? this.unfinishedActionCount > 0
: this._sessionOwnsScheduledContinuations(continuationMessages);
if (shouldReschedule) {
this._schedulePostCompactionContinue();
} else {
this._scheduledPostCompactionContinuationMessages = [];
private async _runScheduledPostCompactionContinue(settlement: PostCompactionContinuationSettlement): Promise<void> {
while (this._postCompactionContinuationScheduled && this._postCompactionContinuationSettlement === settlement) {
await this.agent.waitForIdle();
await this.waitForRetry();
await this._waitForRefineIdle();
await this._waitForQueuedWorkResume(settlement);
const compactionOperation = this._compactionOperation;
if (compactionOperation) {
await Promise.race([compactionOperation, settlement.promise]);
continue;
}

const commitFence = await this._acquireSessionActionCommitFence();
let continuation: Promise<void> | undefined;
let continuationMessages: AgentMessage[] = [];
let waitForSessionInput = false;
try {
await this.agent.waitForIdle();
if (
!this._postCompactionContinuationScheduled ||
this._postCompactionContinuationSettlement !== settlement
) {
return;
}

if (this._queuedWorkPauses.size > 0 || this._compactionOperation) {
continue;
}

continuationMessages = [...this._scheduledPostCompactionContinuationMessages];
if (continuationMessages.length > 0 && !this._sessionOwnsScheduledContinuations(continuationMessages)) {
this._cancelPostCompactionContinue();
this._scheduleAutoRefineAfterAgentEnd();
return;
}
if (this.unfinishedActionCount > 0 || this._sessionInputPumpRequested) {
this._scheduleSessionInputPump();
waitForSessionInput = true;
} else {
this._postCompactionContinuationScheduled = false;
continuation = this.agent.continue();
}
Comment on lines +7685 to 7687

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High core/agent-session.ts:7685

Messages from agent.continue() are silently lost (never persisted, never delivered to observers) when a concurrent refine() disconnects the agent listener between the _waitForRefineIdle() call at the top of the loop and the agent.continue() call inside the commit fence. The first _waitForRefineIdle() passes, but by the time continuation is invoked, _applyRefine has set _refineInFlight and called _disconnectFromAgent(), so the continuation's events have no subscriber.

A second _waitForRefineIdle() check is needed inside the commit fence, just before calling agent.continue(), to ensure no refine application started in the gap.

 				} else {
 					this._postCompactionContinuationScheduled = false;
+					await this._waitForRefineIdle();
 					continuation = this.agent.continue();
 				}
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @packages/coding-agent/src/core/agent-session.ts around lines 7685-7687:

Messages from `agent.continue()` are silently lost (never persisted, never delivered to observers) when a concurrent `refine()` disconnects the agent listener between the `_waitForRefineIdle()` call at the top of the loop and the `agent.continue()` call inside the commit fence. The first `_waitForRefineIdle()` passes, but by the time `continuation` is invoked, `_applyRefine` has set `_refineInFlight` and called `_disconnectFromAgent()`, so the continuation's events have no subscriber.

A second `_waitForRefineIdle()` check is needed inside the commit fence, just before calling `agent.continue()`, to ensure no refine application started in the gap.

Evidence trail:
packages/coding-agent/src/core/agent-session.ts:7646-7689 @ ed169d3f5f6385b8a1ca522159f01542c268988c
packages/coding-agent/src/core/agent-session.ts:8030-8068 @ ed169d3f5f6385b8a1ca522159f01542c268988c
packages/coding-agent/src/core/agent-session.ts:8199-8215,8303-8310 @ ed169d3f5f6385b8a1ca522159f01542c268988c
packages/coding-agent/src/core/agent-session.ts:3817-3852 @ ed169d3f5f6385b8a1ca522159f01542c268988c
git diff MERGE_BASE REVIEWED_COMMIT -- packages/coding-agent/src/core/agent-session.ts

} finally {
commitFence.release();
}
return;
}

this._postCompactionContinuationScheduled = false;
try {
await this.agent.continue();
this._forgetConsumedPostCompactionContinuations(continuationMessages);
} catch (error) {
const code = error instanceof AgentContinueError ? error.code : undefined;
if (code === "busy") {
this._schedulePostCompactionContinue();
} else if (code !== "nothing-to-continue") {
// "nothing-to-continue" means the turn already completed; anything else must reject headless idle waiters.
this._settlePostCompactionContinue(this._asError(error));
if (waitForSessionInput) {
await this.waitForIdle();
if (this._postCompactionContinuationSettlement !== settlement) return;
const shouldContinue =
(settlement.continueAfterSessionInput && continuationMessages.length === 0) ||
this._sessionOwnsScheduledContinuations(continuationMessages);
if (shouldContinue) {
this._scheduledPostCompactionContinuationMessages = [...this._postCompactionContinuationMessages];
continue;
}
this._postCompactionContinuationScheduled = false;
this._scheduledPostCompactionContinuationMessages = [];
this._scheduleAutoRefineAfterAgentEnd();
return;
}

try {
await continuation;
this._forgetConsumedPostCompactionContinuations(continuationMessages);
return;
} catch (error) {
const code = error instanceof AgentContinueError ? error.code : undefined;
if (code === "busy") {
if (this._postCompactionContinuationSettlement === settlement) {
this._postCompactionContinuationScheduled = true;
this._scheduledPostCompactionContinuationMessages = [...this._postCompactionContinuationMessages];
}
continue;
}
if (code !== "nothing-to-continue" && this._postCompactionContinuationSettlement === settlement) {
this._settlePostCompactionContinue(this._asError(error));
}
return;
}
}
}
Expand Down Expand Up @@ -8489,7 +8535,7 @@ export class AgentSession {
(reason === "requested" || reason === "threshold") &&
(shouldContinueAfterCompaction || this.agent.hasQueuedMessages() || this.hasPendingSessionWork)
) {
this._schedulePostCompactionContinue();
this._schedulePostCompactionContinue(shouldContinueAfterCompaction);
}
};

Expand Down Expand Up @@ -8541,13 +8587,13 @@ export class AgentSession {
this.agent.state.messages = messages.slice(0, -1);
}

this._schedulePostCompactionContinue();
this._schedulePostCompactionContinue(true);
this._scheduleAutoRefineAfterCompaction(willContinueAfterCompaction);
return true;
} else if (shouldContinueAfterCompaction || hasQueuedMessages) {
// Compaction can intentionally stop a tool loop between turns.
// Queued follow-up/steering/custom messages can also be waiting.
this._schedulePostCompactionContinue();
this._schedulePostCompactionContinue(shouldContinueAfterCompaction);
this._scheduleAutoRefineAfterCompaction(willContinueAfterCompaction);
} else {
this._scheduleAutoRefineAfterCompaction(willContinueAfterCompaction);
Expand Down
23 changes: 12 additions & 11 deletions packages/coding-agent/src/core/kernel/repl-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import {
parseDiffDisplay,
parseSentAgentMessage,
raceStartupWithAbort,
SNAPSHOT_DISPOSE_TIMEOUT_MS,
SNAPSHOT_EXECUTION_TIMEOUT_MS,
} from "./shared.js";
import {
Expand Down Expand Up @@ -1100,19 +1099,21 @@ export class ReplKernelManager {
}
}

/** Best-effort final snapshot before a graceful dispose, bounded by a timeout. */
private async flushSnapshotForDispose(): Promise<void> {
if (!this.options.snapshot || !this.isRunning) return;
const pendingExecutions = this.executionQueue;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High kernel/repl-manager.ts:1104

dispose() and shutdown({ snapshot: true }) can wait indefinitely instead of honoring SNAPSHOT_EXECUTION_TIMEOUT_MS. flushSnapshotForDispose() captures executionQueue before waiting, so a concurrent execute() can enqueue a non-terminating request afterward; captureSnapshot() queues behind it, and its timeout does not start until that request finishes. Reserve the queue before awaiting it (or otherwise block new executions) so the final snapshot cannot be overtaken.

🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @packages/coding-agent/src/core/kernel/repl-manager.ts around line 1104:

`dispose()` and `shutdown({ snapshot: true })` can wait indefinitely instead of honoring `SNAPSHOT_EXECUTION_TIMEOUT_MS`. `flushSnapshotForDispose()` captures `executionQueue` before waiting, so a concurrent `execute()` can enqueue a non-terminating request afterward; `captureSnapshot()` queues behind it, and its timeout does not start until that request finishes. Reserve the queue before awaiting it (or otherwise block new executions) so the final snapshot cannot be overtaken.

Evidence trail:
packages/coding-agent/src/core/kernel/repl-manager.ts:454-497, 897-910, 1002-1020, 1102-1126 at ed169d3f5f6385b8a1ca522159f01542c268988c

if (this.activeExecution) void this.interrupt().catch(() => undefined);
let timeout: ReturnType<typeof globalThis.setTimeout> | undefined;
const guard = new Promise<void>((resolve) => {
timeout = globalThis.setTimeout(resolve, SNAPSHOT_DISPOSE_TIMEOUT_MS);
if (timeout && typeof timeout === "object" && "unref" in timeout) timeout.unref();
});
try {
await Promise.race([this.snapshotState().then(() => undefined), guard]);
} finally {
if (timeout) clearTimeout(timeout);
}
const queueSettled = await Promise.race([
pendingExecutions.then(() => true),
new Promise<false>((resolve) => {
timeout = globalThis.setTimeout(() => resolve(false), SNAPSHOT_EXECUTION_TIMEOUT_MS);
timeout.unref?.();
}),
]);
if (timeout) globalThis.clearTimeout(timeout);
if (!queueSettled) return;
await this.captureSnapshot({ executionTimeoutMs: SNAPSHOT_EXECUTION_TIMEOUT_MS });
}

/** Graceful cleanup. Waits briefly for in-flight host request handlers before killing the child. */
Expand Down
3 changes: 0 additions & 3 deletions packages/coding-agent/src/core/kernel/shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ export const DEFAULT_MAX_OUTPUT_CHARS = 65536;
export const HOST_REQUEST_DISPOSE_TIMEOUT_MS = 5000;
export const KERNEL_SHUTDOWN_TIMEOUT_MS = 5000;
export const DEFAULT_SNAPSHOT_DEBOUNCE_MS = 1500;
// Cap how long a graceful dispose waits on the final snapshot; the debounced
// on-disk copy is the fallback if this is exceeded.
export const SNAPSHOT_DISPOSE_TIMEOUT_MS = 5000;
export const SNAPSHOT_EXECUTION_TIMEOUT_MS = 5000;
export const KERNEL_ABORT_GRACE_MS = 1000;
export const KERNEL_BUSY_REUSE_WAIT_MS = 5000;
Expand Down
Loading
Loading