UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

58 lines (57 loc) • 3.03 kB
import { a as loadExactSessionEntryReadOnly } from "./session-accessor.sqlite-exact-read-HBi2gDDN.mjs"; import { r as captureGatewaySessionWorkAdmissions } from "./session-lifecycle-admission-B5CJ-emz.mjs"; import "./session-accessor-C3ljJ974.mjs"; import "./device-provider-identity-v6nXqNq_.mjs"; import { n as isExactAttachedEnvironment } from "./placement-target-BZL1jHxv.mjs"; //#region src/gateway/worker-environments/device-placement-demand.ts function captureDemand(sources) { const gatewayContext = sources.resolveGatewayContext(); const admissions = captureGatewaySessionWorkAdmissions(sources.resolveGatewayContext); const targets = /* @__PURE__ */ new Set(); if (gatewayContext) for (const identities of admissions.targets.values()) for (const identity of identities) targets.add(identity); return { admissions, targets: [...targets], gatewayContext }; } function projectDemand(sources, admissions, placements, excludeSessionId) { const demand = /* @__PURE__ */ new Map(); const countedEnvironments = /* @__PURE__ */ new Set(); for (const [scope, identities] of admissions.targets) for (const identity of identities) { const placement = placements.get(identity); if (!placement || placement.sessionId === excludeSessionId || placement.state !== "active" || placement.executionMode !== "worker-turn" || countedEnvironments.has(placement.environmentId) || !admissions.isActive({ scope, sessionKey: placement.sessionKey, sessionId: placement.sessionId })) continue; if (loadExactSessionEntryReadOnly({ storePath: scope, sessionKey: placement.sessionKey, agentId: placement.agentId, projection: "list" })?.entry.sessionId !== placement.sessionId) continue; const environment = sources.environments.get(placement.environmentId); if (environment?.providerId !== "device" || !environment.nodeDeviceId || !isExactAttachedEnvironment(environment, placement)) continue; countedEnvironments.add(environment.environmentId); demand.set(environment.nodeDeviceId, (demand.get(environment.nodeDeviceId) ?? 0) + 1); } return demand; } /** Projects admitted session work without turning idle placements into slot reservations. */ function createDevicePlacementDemandReader(sources) { return (excludeSessionId) => { const { admissions, targets } = captureDemand(sources); return targets.length ? projectDemand(sources, admissions, sources.placements.getMany(targets), excludeSessionId) : /* @__PURE__ */ new Map(); }; } function createDevicePlacementDemandReaderAsync(sources) { return async (excludeSessionId) => { const { admissions, targets, gatewayContext } = captureDemand(sources); if (!targets.length) return /* @__PURE__ */ new Map(); const placements = await sources.placements.getManyAsync(targets); return sources.resolveGatewayContext() === gatewayContext ? projectDemand(sources, admissions, placements, excludeSessionId) : /* @__PURE__ */ new Map(); }; } //#endregion export { createDevicePlacementDemandReader, createDevicePlacementDemandReaderAsync };