import { p as defaultRuntime } from "./entry.js"; import "./auth-profiles-CfFGCDJa.js"; import { P as normalizeMainKey } from "./agent-scope-jm0ZdXwM.js"; import "./utils-PmTbZoD1.js"; import "./exec-BIMFe4XS.js"; import "./github-copilot-token-rP-6QdKv.js"; import "./pi-model-discovery-CsRo-xMp.js"; import { r as loadConfig } from "./config-DxJyvt4o.js"; import "./manifest-registry-tuAcHxrV.js"; import "./server-context-CM_E6wD5.js"; import "./errors-DdT2Dtkb.js"; import "./control-service-BSfjo9v7.js"; import "./client-BYx0ZoAv.js"; import "./call-BDMBg5WA.js"; import "./message-channel-Csfn34Sf.js"; import "./links-jGisPfXW.js"; import { r as normalizeChannelId } from "./plugins-TrKFfrLt.js"; import "./logging-fywhKCmE.js"; import "./accounts-B5QZU96b.js"; import { Hn as requestHeartbeatNow, nn as loadSessionEntry, zn as enqueueSystemEvent } from "./loader-DpqWKh1q.js"; import "./progress-Dn3kWpaL.js"; import "./prompt-style-D5D7b3cX.js"; import "./manager-rDmdE7O9.js"; import "./paths-RvF0P6tQ.js"; import "./sqlite-B_L84oiu.js"; import "./routes-XDcV8NF0.js"; import "./pi-embedded-helpers-wpP9rGyv.js"; import "./deliver-GshcYxn_.js"; import { g as updateSessionStore } from "./sandbox-DO8gYgPg.js"; import "./channel-summary-CgnCeeeN.js"; import "./wsl-CuoepaB0.js"; import "./skills-DtwGIkTI.js"; import "./image-FBFXvDnM.js"; import "./redact-CDPAzwi8.js"; import "./tool-display-BMYWrp0L.js"; import "./restart-sentinel-DywisDen.js"; import "./channel-selection-BM0IKqqi.js"; import "./commands-DSjmdo4s.js"; import "./pairing-store-DMex6WWe.js"; import "./login-qr-C-zwYd95.js"; import "./pairing-labels-C6I3dD-m.js"; import "./deps-IViLD7E4.js"; import { t as formatForLog } from "./ws-log-BK-b63ZP.js"; import { t as agentCommand } from "./agent-D69tT_Dc.js"; import { randomUUID } from "node:crypto"; //#region src/gateway/server-node-events.ts const handleNodeEvent = async (ctx, nodeId, evt) => { switch (evt.event) { case "voice.transcript": { if (!evt.payloadJSON) return; let payload; try { payload = JSON.parse(evt.payloadJSON); } catch { return; } const obj = typeof payload === "object" && payload !== null ? payload : {}; const text = typeof obj.text === "string" ? obj.text.trim() : ""; if (!text) return; if (text.length > 2e4) return; const sessionKeyRaw = typeof obj.sessionKey === "string" ? obj.sessionKey.trim() : ""; const rawMainKey = normalizeMainKey(loadConfig().session?.mainKey); const sessionKey = sessionKeyRaw.length > 0 ? sessionKeyRaw : rawMainKey; const { storePath, entry, canonicalKey } = loadSessionEntry(sessionKey); const now = Date.now(); const sessionId = entry?.sessionId ?? randomUUID(); if (storePath) await updateSessionStore(storePath, (store) => { store[canonicalKey] = { sessionId, updatedAt: now, thinkingLevel: entry?.thinkingLevel, verboseLevel: entry?.verboseLevel, reasoningLevel: entry?.reasoningLevel, systemSent: entry?.systemSent, sendPolicy: entry?.sendPolicy, lastChannel: entry?.lastChannel, lastTo: entry?.lastTo }; }); ctx.addChatRun(sessionId, { sessionKey, clientRunId: `voice-${randomUUID()}` }); agentCommand({ message: text, sessionId, sessionKey, thinking: "low", deliver: false, messageChannel: "node" }, defaultRuntime, ctx.deps).catch((err) => { ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`); }); return; } case "agent.request": { if (!evt.payloadJSON) return; let link = null; try { link = JSON.parse(evt.payloadJSON); } catch { return; } const message = (link?.message ?? "").trim(); if (!message) return; if (message.length > 2e4) return; const channel = normalizeChannelId(typeof link?.channel === "string" ? link.channel.trim() : "") ?? void 0; const to = typeof link?.to === "string" && link.to.trim() ? link.to.trim() : void 0; const deliver = Boolean(link?.deliver) && Boolean(channel); const sessionKeyRaw = (link?.sessionKey ?? "").trim(); const sessionKey = sessionKeyRaw.length > 0 ? sessionKeyRaw : `node-${nodeId}`; const { storePath, entry, canonicalKey } = loadSessionEntry(sessionKey); const now = Date.now(); const sessionId = entry?.sessionId ?? randomUUID(); if (storePath) await updateSessionStore(storePath, (store) => { store[canonicalKey] = { sessionId, updatedAt: now, thinkingLevel: entry?.thinkingLevel, verboseLevel: entry?.verboseLevel, reasoningLevel: entry?.reasoningLevel, systemSent: entry?.systemSent, sendPolicy: entry?.sendPolicy, lastChannel: entry?.lastChannel, lastTo: entry?.lastTo }; }); agentCommand({ message, sessionId, sessionKey, thinking: link?.thinking ?? void 0, deliver, to, channel, timeout: typeof link?.timeoutSeconds === "number" ? link.timeoutSeconds.toString() : void 0, messageChannel: "node" }, defaultRuntime, ctx.deps).catch((err) => { ctx.logGateway.warn(`agent failed node=${nodeId}: ${formatForLog(err)}`); }); return; } case "chat.subscribe": { if (!evt.payloadJSON) return; let payload; try { payload = JSON.parse(evt.payloadJSON); } catch { return; } const obj = typeof payload === "object" && payload !== null ? payload : {}; const sessionKey = typeof obj.sessionKey === "string" ? obj.sessionKey.trim() : ""; if (!sessionKey) return; ctx.nodeSubscribe(nodeId, sessionKey); return; } case "chat.unsubscribe": { if (!evt.payloadJSON) return; let payload; try { payload = JSON.parse(evt.payloadJSON); } catch { return; } const obj = typeof payload === "object" && payload !== null ? payload : {}; const sessionKey = typeof obj.sessionKey === "string" ? obj.sessionKey.trim() : ""; if (!sessionKey) return; ctx.nodeUnsubscribe(nodeId, sessionKey); return; } case "exec.started": case "exec.finished": case "exec.denied": { if (!evt.payloadJSON) return; let payload; try { payload = JSON.parse(evt.payloadJSON); } catch { return; } const obj = typeof payload === "object" && payload !== null ? payload : {}; const sessionKey = typeof obj.sessionKey === "string" ? obj.sessionKey.trim() : `node-${nodeId}`; if (!sessionKey) return; const runId = typeof obj.runId === "string" ? obj.runId.trim() : ""; const command = typeof obj.command === "string" ? obj.command.trim() : ""; const exitCode = typeof obj.exitCode === "number" && Number.isFinite(obj.exitCode) ? obj.exitCode : void 0; const timedOut = obj.timedOut === true; const output = typeof obj.output === "string" ? obj.output.trim() : ""; const reason = typeof obj.reason === "string" ? obj.reason.trim() : ""; let text = ""; if (evt.event === "exec.started") { text = `Exec started (node=${nodeId}${runId ? ` id=${runId}` : ""})`; if (command) text += `: ${command}`; } else if (evt.event === "exec.finished") { const exitLabel = timedOut ? "timeout" : `code ${exitCode ?? "?"}`; text = `Exec finished (node=${nodeId}${runId ? ` id=${runId}` : ""}, ${exitLabel})`; if (output) text += `\n${output}`; } else { text = `Exec denied (node=${nodeId}${runId ? ` id=${runId}` : ""}${reason ? `, ${reason}` : ""})`; if (command) text += `: ${command}`; } enqueueSystemEvent(text, { sessionKey, contextKey: runId ? `exec:${runId}` : "exec" }); requestHeartbeatNow({ reason: "exec-event" }); return; } default: return; } }; //#endregion export { handleNodeEvent };