feat(gateway): complete openclaw phase1 queue parity v2

This commit is contained in:
William Valentin
2026-02-16 12:04:33 -08:00
parent 78da226542
commit 813a0dc5c5
19 changed files with 678 additions and 53 deletions
+46 -6
View File
@@ -205,14 +205,54 @@ export class GatewayServer {
sessionBridge: this.sessionBridge,
laneQueue: this.laneQueue,
resolveQueuePolicy: ({ sessionId, channel }) => {
const sessionPolicy = sessionId
? this.config.queue?.overrides?.sessions?.[sessionId]
: undefined;
if (sessionPolicy) {
return sessionPolicy;
const resolved: Partial<LaneQueueConfig> = {};
const channelPolicy = this.config.queue?.overrides?.channels?.[channel];
if (channelPolicy) {
Object.assign(resolved, channelPolicy);
}
return this.config.queue?.overrides?.channels?.[channel];
const configuredSessionPolicy = sessionId
? this.config.queue?.overrides?.sessions?.[sessionId]
: undefined;
if (configuredSessionPolicy) {
Object.assign(resolved, configuredSessionPolicy);
}
if (sessionId) {
const runtimeMode = this.config.sessionManager.getSessionConfig('ws', sessionId, 'queue.mode');
const runtimeCap = this.config.sessionManager.getSessionConfig('ws', sessionId, 'queue.cap');
const runtimeOverflow = this.config.sessionManager.getSessionConfig('ws', sessionId, 'queue.overflow');
const runtimeDebounce = this.config.sessionManager.getSessionConfig('ws', sessionId, 'queue.debounce_ms');
const runtimeSummarize = this.config.sessionManager.getSessionConfig('ws', sessionId, 'queue.summarize_overflow');
if (runtimeMode && ['collect', 'followup', 'steer', 'steer_backlog', 'interrupt'].includes(runtimeMode)) {
resolved.mode = runtimeMode as LaneQueueConfig['mode'];
}
if (runtimeCap) {
const cap = Number.parseInt(runtimeCap, 10);
if (Number.isFinite(cap) && cap >= 1 && cap <= 1000) {
resolved.cap = cap;
}
}
if (runtimeOverflow && (runtimeOverflow === 'drop_old' || runtimeOverflow === 'drop_new')) {
resolved.overflow = runtimeOverflow;
}
if (runtimeDebounce) {
const debounceMs = Number.parseInt(runtimeDebounce, 10);
if (Number.isFinite(debounceMs) && debounceMs >= 0 && debounceMs <= 60_000) {
resolved.debounceMs = debounceMs;
}
}
if (runtimeSummarize === 'true' || runtimeSummarize === 'false') {
resolved.summarizeOverflow = runtimeSummarize === 'true';
}
}
return resolved;
},
metrics: this.metrics,
sessionManager: this.config.sessionManager,