Merge pull request #2901 from pikasTech/fix/hwlab-l2-workbench-runtime-align
Pipelines as Code CI / platform-infra-gitea-nc01- Success
Pipelines as Code CI / unidesk-host- Success

修复 Workbench L2 运行配置漂移
This commit is contained in:
Lyon
2026-07-23 13:06:02 +08:00
committed by GitHub
2 changed files with 95 additions and 4 deletions
@@ -124,10 +124,9 @@ function patchCodeAgentRuntimeWorkloads() {
fileChanged = patchCloudApiRuntimeEnv(container, runtime) || fileChanged;
if (kafka) fileChanged = patchCloudApiKafkaEnv(container, kafka) || fileChanged;
}
if (kafka && workloadName === "hwlab-cloud-web" && container.name === "hwlab-cloud-web") {
fileChanged = setEnvValue(container, "HWLAB_WORKBENCH_LIVE_KAFKA_SSE_ENABLED", String(kafka.enabled && kafka.features.liveKafkaSse)) || fileChanged;
fileChanged = setEnvValue(container, "HWLAB_WORKBENCH_KAFKA_REFRESH_REPLAY_ENABLED", String(kafka.enabled && kafka.features.kafkaRefreshReplay)) || fileChanged;
fileChanged = setEnvValue(container, "HWLAB_WORKBENCH_PROJECTION_REALTIME_ENABLED", String(kafka.enabled && kafka.features.projectionRealtime)) || fileChanged;
if (workloadName === "hwlab-cloud-web" && container.name === "hwlab-cloud-web") {
if (kafka) fileChanged = patchCloudWebKafkaEnv(container, kafka) || fileChanged;
fileChanged = patchCloudWebRuntimeEnv(container, runtime.workbench?.webRuntimeConfig) || fileChanged;
}
}
}
@@ -157,6 +156,14 @@ function patchCloudApiRuntimeEnv(container, runtime) {
}
changed = setEnvValue(container, "HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE", String(runtime.defaultProviderProfile)) || changed;
changed = setEnvValue(container, "HWLAB_CODE_AGENT_CODEX_STDIO_SUPERVISOR", String(runtime.codexStdioSupervisor)) || changed;
const workbench = runtime.workbench;
if (typeof workbench?.emptySessionGc?.enabled === "boolean") {
changed = setEnvValue(container, "HWLAB_WORKBENCH_EMPTY_SESSION_GC_ENABLED", String(workbench.emptySessionGc.enabled)) || changed;
}
const isolatedKafka = workbench?.webRuntimeConfig?.workbench?.debugCapabilities?.isolatedKafka;
if (typeof isolatedKafka === "boolean") {
changed = setEnvValue(container, "HWLAB_WORKBENCH_KAFKA_DEBUG_REPLAY_ENABLED", String(isolatedKafka)) || changed;
}
return changed;
}
@@ -186,6 +193,16 @@ function patchCloudApiKafkaEnv(container, kafka) {
HWLAB_WORKBENCH_KAFKA_REFRESH_REPLAY_MATCHED_EVENT_LIMIT: kafka.refreshReplay?.matchedEventLimit,
HWLAB_WORKBENCH_KAFKA_REFRESH_REPLAY_LIVE_BUFFER_LIMIT: kafka.refreshReplay?.liveBufferLimit,
}) || changed;
const sessionIndex = kafka.refreshReplay?.sessionIndex;
const sessionIndexConfigured = refreshReplayEnabled && typeof sessionIndex?.enabled === "boolean";
changed = patchOptionalEnvGroup(container, sessionIndexConfigured, {
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_ENABLED: sessionIndex?.enabled,
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_MAX_EVENTS: sessionIndex?.maxEvents,
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_MAX_EVENTS_PER_SESSION: sessionIndex?.maxEventsPerSession,
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_BOOTSTRAP_TIMEOUT_MS: sessionIndex?.bootstrapTimeoutMs,
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_REBUILD_INTERVAL_MS: sessionIndex?.rebuildIntervalMs,
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_REBUILD_COOLDOWN_MS: sessionIndex?.rebuildCooldownMs,
}) || changed;
changed = removeEnvValues(container, [
"HWLAB_KAFKA_PROJECTOR_HEARTBEAT_INTERVAL_MS",
"HWLAB_KAFKA_OUTBOX_RELAY_INTERVAL_MS",
@@ -200,6 +217,42 @@ function patchCloudApiKafkaEnv(container, kafka) {
return changed;
}
function patchCloudWebKafkaEnv(container, kafka) {
let changed = false;
changed = setEnvValue(container, "HWLAB_WORKBENCH_LIVE_KAFKA_SSE_ENABLED", String(kafka.enabled && kafka.features.liveKafkaSse)) || changed;
changed = setEnvValue(container, "HWLAB_WORKBENCH_KAFKA_REFRESH_REPLAY_ENABLED", String(kafka.enabled && kafka.features.kafkaRefreshReplay)) || changed;
changed = setEnvValue(container, "HWLAB_WORKBENCH_PROJECTION_REALTIME_ENABLED", String(kafka.enabled && kafka.features.projectionRealtime)) || changed;
return changed;
}
function patchCloudWebRuntimeEnv(container, webRuntimeConfig) {
if (!webRuntimeConfig) return false;
let changed = false;
const displayTime = webRuntimeConfig.displayTime;
const workbench = webRuntimeConfig.workbench;
const debug = workbench?.debugCapabilities;
const rawEvents = debug?.rawHwlabEventWindow;
const traceTimeline = workbench?.traceTimeline;
if (displayTime) {
changed = setEnvValue(container, "HWLAB_CLOUD_WEB_DISPLAY_TIME_ZONE", String(displayTime.timeZone)) || changed;
changed = setEnvValue(container, "HWLAB_CLOUD_WEB_DISPLAY_TIME_LOCALE", String(displayTime.locale)) || changed;
changed = setEnvValue(container, "HWLAB_CLOUD_WEB_DISPLAY_TIME_LABEL", String(displayTime.label)) || changed;
}
if (typeof debug?.isolatedKafka === "boolean") {
changed = setEnvValue(container, "HWLAB_WORKBENCH_KAFKA_DEBUG_REPLAY_ENABLED", String(debug.isolatedKafka)) || changed;
}
if (rawEvents) {
changed = setEnvValue(container, "HWLAB_WORKBENCH_RAW_HWLAB_EVENT_WINDOW_ENABLED", String(rawEvents.enabled)) || changed;
changed = setEnvValue(container, "HWLAB_WORKBENCH_RAW_HWLAB_EVENT_WINDOW_MAX_ENTRIES", String(rawEvents.maxEntries)) || changed;
changed = setEnvValue(container, "HWLAB_WORKBENCH_RAW_HWLAB_EVENT_WINDOW_MAX_RETAINED_BYTES", String(rawEvents.maxRetainedBytes)) || changed;
}
if (traceTimeline) {
changed = setEnvValue(container, "HWLAB_WORKBENCH_TRACE_AUTO_EXPAND_RUNNING", String(traceTimeline.autoExpandRunning)) || changed;
changed = setEnvValue(container, "HWLAB_WORKBENCH_TRACE_AUTO_COLLAPSE_TERMINAL", String(traceTimeline.autoCollapseTerminal)) || changed;
}
return changed;
}
function patchOptionalEnvGroup(container, enabled, values) {
let changed = false;
for (const [name, value] of Object.entries(values)) {
@@ -50,6 +50,14 @@ test("patches YAML-owned Code Agent and Kafka runtime settings", () => {
HWLAB_KAFKA_TRANSACTIONAL_PROJECTOR_ENABLED: "false",
HWLAB_KAFKA_PROJECTOR_GROUP_ID: "hwlab-projector",
HWLAB_KAFKA_HWLAB_EVENT_GROUP_ID: "hwlab-events",
HWLAB_WORKBENCH_EMPTY_SESSION_GC_ENABLED: "false",
HWLAB_WORKBENCH_KAFKA_DEBUG_REPLAY_ENABLED: "false",
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_ENABLED: "true",
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_MAX_EVENTS: "100000",
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_MAX_EVENTS_PER_SESSION: "10000",
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_BOOTSTRAP_TIMEOUT_MS: "30000",
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_REBUILD_INTERVAL_MS: "300000",
HWLAB_WORKBENCH_KAFKA_REFRESH_INDEX_REBUILD_COOLDOWN_MS: "30000",
});
expect(envSecret(api, "AGENTRUN_API_KEY")).toEqual({ name: "hwlab-v03-master-server-admin-api-key", key: "api-key" });
@@ -59,6 +67,15 @@ test("patches YAML-owned Code Agent and Kafka runtime settings", () => {
HWLAB_WORKBENCH_LIVE_KAFKA_SSE_ENABLED: "true",
HWLAB_WORKBENCH_KAFKA_REFRESH_REPLAY_ENABLED: "true",
HWLAB_WORKBENCH_PROJECTION_REALTIME_ENABLED: "false",
HWLAB_WORKBENCH_KAFKA_DEBUG_REPLAY_ENABLED: "false",
HWLAB_WORKBENCH_RAW_HWLAB_EVENT_WINDOW_ENABLED: "false",
HWLAB_WORKBENCH_RAW_HWLAB_EVENT_WINDOW_MAX_ENTRIES: "1",
HWLAB_WORKBENCH_RAW_HWLAB_EVENT_WINDOW_MAX_RETAINED_BYTES: "1",
HWLAB_WORKBENCH_TRACE_AUTO_EXPAND_RUNNING: "true",
HWLAB_WORKBENCH_TRACE_AUTO_COLLAPSE_TERMINAL: "true",
HWLAB_CLOUD_WEB_DISPLAY_TIME_ZONE: "Asia/Shanghai",
HWLAB_CLOUD_WEB_DISPLAY_TIME_LOCALE: "zh-CN",
HWLAB_CLOUD_WEB_DISPLAY_TIME_LABEL: "北京时间",
});
const list = Bun.YAML.parse(readFileSync(join(runtimeDir, "list.yaml"), "utf8")) as any;
@@ -169,6 +186,19 @@ function overlay(runtimePath: string) {
},
defaultProviderProfile: "gpt.pika",
codexStdioSupervisor: "repo-owned",
workbench: {
emptySessionGc: { enabled: false },
webRuntimeConfig: {
displayTime: { timeZone: "Asia/Shanghai", locale: "zh-CN", label: "北京时间" },
workbench: {
debugCapabilities: {
isolatedKafka: false,
rawHwlabEventWindow: { enabled: false, maxEntries: 1, maxRetainedBytes: 1 },
},
traceTimeline: { autoExpandRunning: true, autoCollapseTerminal: true },
},
},
},
kafkaEventBridge: {
enabled: true,
bootstrapServers: "kafka.platform-infra.svc.cluster.local:9092",
@@ -193,6 +223,14 @@ function overlay(runtimePath: string) {
scanLimit: 1000,
matchedEventLimit: 100,
liveBufferLimit: 100,
sessionIndex: {
enabled: true,
maxEvents: 100000,
maxEventsPerSession: 10000,
bootstrapTimeoutMs: 30000,
rebuildIntervalMs: 300000,
rebuildCooldownMs: 30000,
},
},
},
},