@symerian/symi 3.1.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +4 -4
- package/dist/bundled/session-memory/handler.js +4 -4
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{chrome-O5GtGEaR.js → chrome-CCtr79A5.js} +4 -4
- package/dist/{chrome-B7_foWil.js → chrome-CLdjGAF1.js} +4 -4
- package/dist/{command-registry-DmjX-MJb.js → command-registry-DtivbkBg.js} +4 -4
- package/dist/{completion-cli-CKczmer5.js → completion-cli-DAtKJGz_.js} +1 -1
- package/dist/{completion-cli-DezSeZQA.js → completion-cli-M9mpw_DS.js} +2 -2
- package/dist/control-ui/js/app.js +34 -2
- package/dist/{deliver-BMg6XjUA.js → deliver-D0zCpBS2.js} +4 -4
- package/dist/{deliver-Cxzii_el.js → deliver-aqjVfua8.js} +4 -4
- package/dist/{doctor-completion-AGw1egU_.js → doctor-completion-BlxU7_DJ.js} +1 -1
- package/dist/{doctor-completion-BCVASe0n.js → doctor-completion-DLx2ecZ2.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +4 -4
- package/dist/{gateway-cli-CvFiUm5D.js → gateway-cli-BDVuQ5k9.js} +6 -354
- package/dist/{gateway-cli-BZXfKM1n.js → gateway-cli-CjY_Ct2M.js} +6 -354
- package/dist/{glass-ui-ws-CHyGj7GA.js → glass-ui-ws-Bs0VbFCC.js} +1 -1
- package/dist/{glass-ui-ws-BSTHY5PU.js → glass-ui-ws-CLyPSA_9.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/llm-slug-generator.js +4 -4
- package/dist/{manager-BWi2hK4Y.js → manager-3gF-gaOU.js} +1 -1
- package/dist/{manager-BoTf2TBM.js → manager-Do_LVG9R.js} +1 -1
- package/dist/{onboard-BzRDv60Y.js → onboard-lFeJdiGp.js} +1 -1
- package/dist/{onboard-CHrTg-R0.js → onboard-zwQ2t4TE.js} +1 -1
- package/dist/{onboarding-ClbxBHpB.js → onboarding-C0kL3Y5v.js} +1 -1
- package/dist/{onboarding-BGwkx8NB.js → onboarding-CaHVfCVn.js} +1 -1
- package/dist/{onboarding.finalize-D6zND3C7.js → onboarding.finalize-DwXxdw74.js} +3 -3
- package/dist/{onboarding.finalize-BnIBZwze.js → onboarding.finalize-vT6fRWsB.js} +4 -4
- package/dist/{pi-embedded-L-sMlPsa.js → pi-embedded-JU-n_Ppj.js} +10 -10
- package/dist/plugin-sdk/gateway/server-chat.d.ts +47 -0
- package/dist/{program-B8S2KFzC.js → program-C1bTgU2q.js} +2 -2
- package/dist/{program-context-DCb3cVEC.js → program-context-BHvgRRy_.js} +6 -6
- package/dist/{prompt-select-styled-BJ3NsTmX.js → prompt-select-styled--PI8fuuB.js} +1 -1
- package/dist/{prompt-select-styled-ZdXAuRQQ.js → prompt-select-styled-DawD9uin.js} +1 -1
- package/dist/{pw-ai-B9riepO_.js → pw-ai-BlFwd1fC.js} +1 -1
- package/dist/{pw-ai-CYE0188Y.js → pw-ai-Cq1WlDax.js} +1 -1
- package/dist/{register.maintenance-CX4sIokB.js → register.maintenance-D0NfR0wv.js} +5 -5
- package/dist/{register.maintenance-BBxWlFhs.js → register.maintenance-fFzETZM-.js} +4 -4
- package/dist/{register.onboard-UzFm__iV.js → register.onboard-C0eFmAVL.js} +2 -2
- package/dist/{register.onboard-Be8PMN1Z.js → register.onboard-C7aJLoQc.js} +2 -2
- package/dist/{register.setup-w0_6rARS.js → register.setup-CRhnePOD.js} +2 -2
- package/dist/{register.setup-Dq7WlLOL.js → register.setup-XpvVOl8-.js} +2 -2
- package/dist/{register.subclis-Cb1ErrVQ.js → register.subclis-BFq9K0q9.js} +3 -3
- package/dist/{run-main-DmC4wWlp.js → run-main-JPtR4nYb.js} +3 -3
- package/dist/{server-methods-C97G9dYe.js → server-methods-Dj3PCErz.js} +360 -4
- package/dist/{server-methods-DFt60s1H.js → server-methods-RegE5bVx.js} +360 -4
- package/dist/{synthesis-DA7kfAUJ.js → synthesis-CNYpM3bL.js} +4 -4
- package/dist/{synthesis-CPZoVKlB.js → synthesis-CP97tsyU.js} +4 -4
- package/dist/{unified-runner-BdN9pHa8.js → unified-runner-Bjd_KpAr.js} +10 -10
- package/dist/{update-cli-Bg3c9ORr.js → update-cli-DPsa1UFx.js} +5 -5
- package/dist/{update-cli-DZtbV25O.js → update-cli-bgziGI6r.js} +4 -4
- package/package.json +1 -1
|
@@ -22,9 +22,9 @@ import "./pairing-token-DZAnUH5B.js";
|
|
|
22
22
|
import { t as safeEqualSecret } from "./secret-equal-CbntzRkh.js";
|
|
23
23
|
import { a as isValidIPv4, c as resolveClientIp, d as resolveHostName, f as rawDataToString, i as isTrustedProxyAddress, l as resolveGatewayBindHost, n as isLoopbackHost, o as normalizeHostHeader, t as isLoopbackAddress, u as resolveGatewayListenHosts } from "./net-DZ5Ayk-W.js";
|
|
24
24
|
import { n as pickPrimaryTailnetIPv4, r as pickPrimaryTailnetIPv6 } from "./tailnet-Cmumpn76.js";
|
|
25
|
-
import { $ as resetDirectoryCache, At as isExternalHookSession, B as createSymiTools, Ct as hasLegacyDeliveryHints, D as runAgentTurn, Dt as buildSafeExternalPrompt,
|
|
25
|
+
import { $ as resetDirectoryCache, At as isExternalHookSession, B as createSymiTools, Ct as hasLegacyDeliveryHints, D as runAgentTurn, Dt as buildSafeExternalPrompt, Ft as consumeGatewaySigusr1RestartAuthorization, H as readLatestAssistantReply, Ht as setPreRestartDeferralCheck, I as resolveModelProfile, It as deferGatewayRestartUntilIdle, K as resolveOutboundSessionRoute, Ln as ToolInputError, Lt as emitGatewayRestart, Ot as detectSuspiciousPatterns, Qt as requestHeartbeatNow, Rt as isGatewaySigusr1RestartExternallyAllowed, S as getTotalPendingReplies, Sn as resolveAgentTimeoutMs, St as buildDeliveryFromLegacyPayload, U as resolveAnnounceTargetFromKey, Vt as setGatewaySigusr1RestartPolicy, X as resolveSessionDeliveryTarget, Y as resolveOutboundTarget, _ as requestBodyErrorToText, _n as extractFileContentFromSource, _r as emitAgentEvent, _t as normalizeOptionalSessionKey, at as consumeRestartSentinel, bn as resolveInputFileLimits, br as registerAgentRunContext, bt as normalizeRequiredName, cr as setCommandLaneConcurrency, dr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, f as getPluginToolMeta, fn as registerUnhandledRejectionHandler, ft as normalizeHttpWebhookUrl, g as readJsonBodyWithLimit, gn as DEFAULT_INPUT_TIMEOUT_MS, gr as clearAgentRunContext, gt as normalizeOptionalAgentId, h as handleSlackHttpRequest, hn as DEFAULT_INPUT_MAX_REDIRECTS, hr as stripHeartbeatToken, ht as inferLegacyName, i as listDescendantRunsForRequester, ir as getActiveTaskCount, k as getActiveEmbeddedRunCount, kt as getHookType, l as applyToolPolicyPipeline, lr as waitForActiveTasks, lt as summarizeRestartSentinel, m as loadSymiPlugins, mn as DEFAULT_INPUT_IMAGE_MIMES, or as getTotalQueueSize, pn as DEFAULT_INPUT_IMAGE_MAX_BYTES, r as initSubagentRegistry, s as runSubagentAnnounceFlow, sr as resetAllLanes, st as formatRestartSentinelMessage, t as countActiveDescendantRuns, tt as runWithModelFallback, u as buildDefaultToolPolicyPipelineSteps, ur as CommandLane, v as buildHistoryContextFromEntries, vn as extractImageContentFromSource, vr as getAgentRunContext, vt as normalizeOptionalText, wn as enqueueSystemEvent, wt as stripLegacyDeliveryFields, xt as migrateLegacyCronPayload, yn as normalizeMimeList, yr as onAgentEvent, yt as normalizePayloadToSystemText, zt as markGatewaySigusr1RestartHandled } from "./subagent-registry-DNcSxvl3.js";
|
|
26
26
|
import { D as resolveSessionResetPolicy, F as resolveMainSessionKey, H as cleanStaleLockFiles, I as resolveMainSessionKeyFromConfig, K as mergeDeliveryContext, M as canonicalizeMainSessionAlias, N as resolveAgentMainSessionKey, T as evaluateSessionFreshness, W as deliveryContextFromSession, d as updateSessionStore, n as parseSessionThreadInfo, o as loadSessionStore } from "./sessions-CrQE7gq3.js";
|
|
27
|
-
import {
|
|
27
|
+
import { n as SILENT_REPLY_TOKEN } from "./tokens-DN4W-XdV.js";
|
|
28
28
|
import { n as listChannelPlugins, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-CYQsm6Gy.js";
|
|
29
29
|
import "./send-BOhR5xu0.js";
|
|
30
30
|
import { r as getMachineDisplayName } from "./with-timeout-DNvX8V3I.js";
|
|
@@ -108,12 +108,12 @@ import { i as toOptionString, n as extractGatewayMiskeys, r as maybeExplainGatew
|
|
|
108
108
|
import { c as probeGateway, s as resolveNodeCommandAllowlist } from "./audit-CHQE7ltJ.js";
|
|
109
109
|
import { t as discoverGatewayBeacons } from "./bonjour-discovery-C9cUMWn-.js";
|
|
110
110
|
import { i as pickGatewaySelfPresence } from "./status-er3ceIYD.js";
|
|
111
|
-
import { a as styleHealthChannelLine, f as onHeartbeatEvent, l as startHeartbeatRunner, m as resolveCronStyleNow, n as getHealthSnapshot, s as runHeartbeatOnce, t as formatHealthChannelLines
|
|
111
|
+
import { a as styleHealthChannelLine, f as onHeartbeatEvent, l as startHeartbeatRunner, m as resolveCronStyleNow, n as getHealthSnapshot, s as runHeartbeatOnce, t as formatHealthChannelLines } from "./health-vDQ4nRJB.js";
|
|
112
112
|
import { n as createDefaultDeps, t as createOutboundSendDeps } from "./outbound-send-deps-KBVliaIJ.js";
|
|
113
113
|
import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-DbqKkizK.js";
|
|
114
114
|
import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, m as normalizeUpdateChannel, n as compareSemverStrings, t as checkUpdateStatus } from "./update-check-CZiE16y_.js";
|
|
115
|
-
import { t as runOnboardingWizard } from "./onboarding-
|
|
116
|
-
import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-
|
|
115
|
+
import { t as runOnboardingWizard } from "./onboarding-C0kL3Y5v.js";
|
|
116
|
+
import { C as createAgentEventHandler, E as startGatewayConfigReloader, S as resolveCronRunLogPath, T as createToolEventRecipientRegistry, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, w as createChatRunState, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-Dj3PCErz.js";
|
|
117
117
|
import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-CZG-Sec1.js";
|
|
118
118
|
import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-DLAM58Wn.js";
|
|
119
119
|
import { a as getCliSessionId, o as setCliSessionId, s as runCliAgent, t as agentCommand } from "./agent-DMDBKAcJ.js";
|
|
@@ -1852,354 +1852,6 @@ function createChannelManager(opts) {
|
|
|
1852
1852
|
};
|
|
1853
1853
|
}
|
|
1854
1854
|
|
|
1855
|
-
//#endregion
|
|
1856
|
-
//#region src/gateway/server-chat.ts
|
|
1857
|
-
function resolveHeartbeatAckMaxChars$1() {
|
|
1858
|
-
try {
|
|
1859
|
-
const cfg = loadConfig();
|
|
1860
|
-
return Math.max(0, cfg.agents?.defaults?.heartbeat?.ackMaxChars ?? DEFAULT_HEARTBEAT_ACK_MAX_CHARS);
|
|
1861
|
-
} catch {
|
|
1862
|
-
return DEFAULT_HEARTBEAT_ACK_MAX_CHARS;
|
|
1863
|
-
}
|
|
1864
|
-
}
|
|
1865
|
-
function resolveHeartbeatContext(runId, sourceRunId) {
|
|
1866
|
-
const primary = getAgentRunContext(runId);
|
|
1867
|
-
if (primary?.isHeartbeat) return primary;
|
|
1868
|
-
if (sourceRunId && sourceRunId !== runId) {
|
|
1869
|
-
const source = getAgentRunContext(sourceRunId);
|
|
1870
|
-
if (source?.isHeartbeat) return source;
|
|
1871
|
-
}
|
|
1872
|
-
return primary;
|
|
1873
|
-
}
|
|
1874
|
-
/**
|
|
1875
|
-
* Check if heartbeat ACK/noise should be hidden from interactive chat surfaces.
|
|
1876
|
-
*/
|
|
1877
|
-
function shouldHideHeartbeatChatOutput(runId, sourceRunId) {
|
|
1878
|
-
if (!resolveHeartbeatContext(runId, sourceRunId)?.isHeartbeat) return false;
|
|
1879
|
-
try {
|
|
1880
|
-
return !resolveHeartbeatVisibility({
|
|
1881
|
-
cfg: loadConfig(),
|
|
1882
|
-
channel: "webchat"
|
|
1883
|
-
}).showOk;
|
|
1884
|
-
} catch {
|
|
1885
|
-
return true;
|
|
1886
|
-
}
|
|
1887
|
-
}
|
|
1888
|
-
function createChatRunRegistry() {
|
|
1889
|
-
const chatRunSessions = /* @__PURE__ */ new Map();
|
|
1890
|
-
const add = (sessionId, entry) => {
|
|
1891
|
-
const queue = chatRunSessions.get(sessionId);
|
|
1892
|
-
if (queue) queue.push(entry);
|
|
1893
|
-
else chatRunSessions.set(sessionId, [entry]);
|
|
1894
|
-
};
|
|
1895
|
-
const peek = (sessionId) => chatRunSessions.get(sessionId)?.[0];
|
|
1896
|
-
const shift = (sessionId) => {
|
|
1897
|
-
const queue = chatRunSessions.get(sessionId);
|
|
1898
|
-
if (!queue || queue.length === 0) return;
|
|
1899
|
-
const entry = queue.shift();
|
|
1900
|
-
if (!queue.length) chatRunSessions.delete(sessionId);
|
|
1901
|
-
return entry;
|
|
1902
|
-
};
|
|
1903
|
-
const remove = (sessionId, clientRunId, sessionKey) => {
|
|
1904
|
-
const queue = chatRunSessions.get(sessionId);
|
|
1905
|
-
if (!queue || queue.length === 0) return;
|
|
1906
|
-
const idx = queue.findIndex((entry) => entry.clientRunId === clientRunId && (sessionKey ? entry.sessionKey === sessionKey : true));
|
|
1907
|
-
if (idx < 0) return;
|
|
1908
|
-
const [entry] = queue.splice(idx, 1);
|
|
1909
|
-
if (!queue.length) chatRunSessions.delete(sessionId);
|
|
1910
|
-
return entry;
|
|
1911
|
-
};
|
|
1912
|
-
const clear = () => {
|
|
1913
|
-
chatRunSessions.clear();
|
|
1914
|
-
};
|
|
1915
|
-
return {
|
|
1916
|
-
add,
|
|
1917
|
-
peek,
|
|
1918
|
-
shift,
|
|
1919
|
-
remove,
|
|
1920
|
-
clear
|
|
1921
|
-
};
|
|
1922
|
-
}
|
|
1923
|
-
function createChatRunState() {
|
|
1924
|
-
const registry = createChatRunRegistry();
|
|
1925
|
-
const buffers = /* @__PURE__ */ new Map();
|
|
1926
|
-
const deltaSentAt = /* @__PURE__ */ new Map();
|
|
1927
|
-
const pendingDeltaText = /* @__PURE__ */ new Map();
|
|
1928
|
-
const abortedRuns = /* @__PURE__ */ new Map();
|
|
1929
|
-
const clear = () => {
|
|
1930
|
-
registry.clear();
|
|
1931
|
-
buffers.clear();
|
|
1932
|
-
deltaSentAt.clear();
|
|
1933
|
-
pendingDeltaText.clear();
|
|
1934
|
-
abortedRuns.clear();
|
|
1935
|
-
};
|
|
1936
|
-
return {
|
|
1937
|
-
registry,
|
|
1938
|
-
buffers,
|
|
1939
|
-
deltaSentAt,
|
|
1940
|
-
pendingDeltaText,
|
|
1941
|
-
abortedRuns,
|
|
1942
|
-
clear
|
|
1943
|
-
};
|
|
1944
|
-
}
|
|
1945
|
-
const TOOL_EVENT_RECIPIENT_TTL_MS = 600 * 1e3;
|
|
1946
|
-
const TOOL_EVENT_RECIPIENT_FINAL_GRACE_MS = 30 * 1e3;
|
|
1947
|
-
function createToolEventRecipientRegistry() {
|
|
1948
|
-
const recipients = /* @__PURE__ */ new Map();
|
|
1949
|
-
const prune = () => {
|
|
1950
|
-
if (recipients.size === 0) return;
|
|
1951
|
-
const now = Date.now();
|
|
1952
|
-
for (const [runId, entry] of recipients) if (now >= (entry.finalizedAt ? entry.finalizedAt + TOOL_EVENT_RECIPIENT_FINAL_GRACE_MS : entry.updatedAt + TOOL_EVENT_RECIPIENT_TTL_MS)) recipients.delete(runId);
|
|
1953
|
-
};
|
|
1954
|
-
const add = (runId, connId) => {
|
|
1955
|
-
if (!runId || !connId) return;
|
|
1956
|
-
const now = Date.now();
|
|
1957
|
-
const existing = recipients.get(runId);
|
|
1958
|
-
if (existing) {
|
|
1959
|
-
existing.connIds.add(connId);
|
|
1960
|
-
existing.updatedAt = now;
|
|
1961
|
-
} else recipients.set(runId, {
|
|
1962
|
-
connIds: new Set([connId]),
|
|
1963
|
-
updatedAt: now
|
|
1964
|
-
});
|
|
1965
|
-
prune();
|
|
1966
|
-
};
|
|
1967
|
-
const get = (runId) => {
|
|
1968
|
-
const entry = recipients.get(runId);
|
|
1969
|
-
if (!entry) return;
|
|
1970
|
-
entry.updatedAt = Date.now();
|
|
1971
|
-
prune();
|
|
1972
|
-
return entry.connIds;
|
|
1973
|
-
};
|
|
1974
|
-
const markFinal = (runId) => {
|
|
1975
|
-
const entry = recipients.get(runId);
|
|
1976
|
-
if (!entry) return;
|
|
1977
|
-
entry.finalizedAt = Date.now();
|
|
1978
|
-
prune();
|
|
1979
|
-
};
|
|
1980
|
-
return {
|
|
1981
|
-
add,
|
|
1982
|
-
get,
|
|
1983
|
-
markFinal
|
|
1984
|
-
};
|
|
1985
|
-
}
|
|
1986
|
-
function createAgentEventHandler({ broadcast, broadcastToConnIds, nodeSendToSession, agentRunSeq, chatRunState, resolveSessionKeyForRun, clearAgentRunContext, toolEventRecipients }) {
|
|
1987
|
-
const emitChatDelta = (sessionKey, clientRunId, sourceRunId, seq, text) => {
|
|
1988
|
-
if (isSilentReplyText(text, SILENT_REPLY_TOKEN)) return;
|
|
1989
|
-
const prev = chatRunState.buffers.get(clientRunId) ?? "";
|
|
1990
|
-
chatRunState.buffers.set(clientRunId, prev + text);
|
|
1991
|
-
if (shouldHideHeartbeatChatOutput(clientRunId, sourceRunId)) return;
|
|
1992
|
-
const now = Date.now();
|
|
1993
|
-
if (now - (chatRunState.deltaSentAt.get(clientRunId) ?? 0) < 150) {
|
|
1994
|
-
chatRunState.pendingDeltaText.set(clientRunId, (chatRunState.pendingDeltaText.get(clientRunId) ?? "") + text);
|
|
1995
|
-
return;
|
|
1996
|
-
}
|
|
1997
|
-
const buffered = chatRunState.pendingDeltaText.get(clientRunId) ?? "";
|
|
1998
|
-
chatRunState.pendingDeltaText.delete(clientRunId);
|
|
1999
|
-
const fullText = buffered + text;
|
|
2000
|
-
chatRunState.deltaSentAt.set(clientRunId, now);
|
|
2001
|
-
const payload = {
|
|
2002
|
-
runId: clientRunId,
|
|
2003
|
-
sessionKey,
|
|
2004
|
-
seq,
|
|
2005
|
-
state: "delta",
|
|
2006
|
-
...resolveHeartbeatContext(clientRunId, sourceRunId)?.isHeartbeat ? { isHeartbeat: true } : {},
|
|
2007
|
-
message: {
|
|
2008
|
-
role: "assistant",
|
|
2009
|
-
content: [{
|
|
2010
|
-
type: "text",
|
|
2011
|
-
text: fullText
|
|
2012
|
-
}],
|
|
2013
|
-
timestamp: now
|
|
2014
|
-
}
|
|
2015
|
-
};
|
|
2016
|
-
broadcast("chat", payload, { dropIfSlow: true });
|
|
2017
|
-
nodeSendToSession(sessionKey, "chat", payload);
|
|
2018
|
-
};
|
|
2019
|
-
const emitChatFinal = (sessionKey, clientRunId, sourceRunId, seq, jobState, error) => {
|
|
2020
|
-
const remainingDelta = chatRunState.pendingDeltaText.get(clientRunId);
|
|
2021
|
-
if (remainingDelta && !shouldHideHeartbeatChatOutput(clientRunId, sourceRunId)) {
|
|
2022
|
-
const flushPayload = {
|
|
2023
|
-
runId: clientRunId,
|
|
2024
|
-
sessionKey,
|
|
2025
|
-
seq,
|
|
2026
|
-
state: "delta",
|
|
2027
|
-
...resolveHeartbeatContext(clientRunId, sourceRunId)?.isHeartbeat ? { isHeartbeat: true } : {},
|
|
2028
|
-
message: {
|
|
2029
|
-
role: "assistant",
|
|
2030
|
-
content: [{
|
|
2031
|
-
type: "text",
|
|
2032
|
-
text: remainingDelta
|
|
2033
|
-
}],
|
|
2034
|
-
timestamp: Date.now()
|
|
2035
|
-
}
|
|
2036
|
-
};
|
|
2037
|
-
broadcast("chat", flushPayload);
|
|
2038
|
-
nodeSendToSession(sessionKey, "chat", flushPayload);
|
|
2039
|
-
}
|
|
2040
|
-
chatRunState.pendingDeltaText.delete(clientRunId);
|
|
2041
|
-
const bufferedText = chatRunState.buffers.get(clientRunId)?.trim() ?? "";
|
|
2042
|
-
const heartbeatCtx = resolveHeartbeatContext(clientRunId, sourceRunId);
|
|
2043
|
-
const isHeartbeatRun = !!heartbeatCtx?.isHeartbeat;
|
|
2044
|
-
const heartbeatHidden = isHeartbeatRun && shouldHideHeartbeatChatOutput(clientRunId, sourceRunId);
|
|
2045
|
-
const filterResult = isHeartbeatRun && !heartbeatHidden ? {
|
|
2046
|
-
action: "deliver",
|
|
2047
|
-
output: bufferedText,
|
|
2048
|
-
reason: "deliver"
|
|
2049
|
-
} : classifyOutboundMessage(bufferedText, {
|
|
2050
|
-
isHeartbeat: heartbeatHidden,
|
|
2051
|
-
heartbeatAckMaxChars: resolveHeartbeatAckMaxChars$1()
|
|
2052
|
-
});
|
|
2053
|
-
const text = filterResult.output.trim();
|
|
2054
|
-
const shouldSuppressSilent = filterResult.action === "drop";
|
|
2055
|
-
chatRunState.buffers.delete(clientRunId);
|
|
2056
|
-
chatRunState.deltaSentAt.delete(clientRunId);
|
|
2057
|
-
if (jobState === "done") {
|
|
2058
|
-
const payload = {
|
|
2059
|
-
runId: clientRunId,
|
|
2060
|
-
sessionKey,
|
|
2061
|
-
seq,
|
|
2062
|
-
state: "final",
|
|
2063
|
-
activeSubagentCount: countActiveRunsForSession(sessionKey),
|
|
2064
|
-
...heartbeatCtx?.isHeartbeat ? { isHeartbeat: true } : {},
|
|
2065
|
-
message: text && !shouldSuppressSilent ? {
|
|
2066
|
-
role: "assistant",
|
|
2067
|
-
content: [{
|
|
2068
|
-
type: "text",
|
|
2069
|
-
text
|
|
2070
|
-
}],
|
|
2071
|
-
timestamp: Date.now()
|
|
2072
|
-
} : void 0
|
|
2073
|
-
};
|
|
2074
|
-
broadcast("chat", payload);
|
|
2075
|
-
nodeSendToSession(sessionKey, "chat", payload);
|
|
2076
|
-
return;
|
|
2077
|
-
}
|
|
2078
|
-
const payload = {
|
|
2079
|
-
runId: clientRunId,
|
|
2080
|
-
sessionKey,
|
|
2081
|
-
seq,
|
|
2082
|
-
state: "error",
|
|
2083
|
-
errorMessage: error ? formatForLog(error) : void 0,
|
|
2084
|
-
...heartbeatCtx?.isHeartbeat ? { isHeartbeat: true } : {}
|
|
2085
|
-
};
|
|
2086
|
-
broadcast("chat", payload);
|
|
2087
|
-
nodeSendToSession(sessionKey, "chat", payload);
|
|
2088
|
-
};
|
|
2089
|
-
const resolveToolVerboseLevel = (runId, sessionKey) => {
|
|
2090
|
-
const runVerbose = normalizeVerboseLevel(getAgentRunContext(runId)?.verboseLevel);
|
|
2091
|
-
if (runVerbose) return runVerbose;
|
|
2092
|
-
if (!sessionKey) return "off";
|
|
2093
|
-
try {
|
|
2094
|
-
const { cfg, entry } = loadSessionEntry(sessionKey);
|
|
2095
|
-
const sessionVerbose = normalizeVerboseLevel(entry?.verboseLevel);
|
|
2096
|
-
if (sessionVerbose) return sessionVerbose;
|
|
2097
|
-
return normalizeVerboseLevel(cfg.agents?.defaults?.verboseDefault) ?? "off";
|
|
2098
|
-
} catch {
|
|
2099
|
-
return "off";
|
|
2100
|
-
}
|
|
2101
|
-
};
|
|
2102
|
-
return (evt) => {
|
|
2103
|
-
const chatLink = chatRunState.registry.peek(evt.runId);
|
|
2104
|
-
const eventSessionKey = typeof evt.sessionKey === "string" && evt.sessionKey.trim() ? evt.sessionKey : void 0;
|
|
2105
|
-
const sessionKey = chatLink?.sessionKey ?? eventSessionKey ?? resolveSessionKeyForRun(evt.runId);
|
|
2106
|
-
if (sessionKey?.startsWith("temp:")) return;
|
|
2107
|
-
const clientRunId = chatLink?.clientRunId ?? evt.runId;
|
|
2108
|
-
const eventRunId = chatLink?.clientRunId ?? evt.runId;
|
|
2109
|
-
const eventForClients = chatLink ? {
|
|
2110
|
-
...evt,
|
|
2111
|
-
runId: eventRunId
|
|
2112
|
-
} : evt;
|
|
2113
|
-
const isAborted = chatRunState.abortedRuns.has(clientRunId) || chatRunState.abortedRuns.has(evt.runId);
|
|
2114
|
-
const heartbeatAgentCtx = resolveHeartbeatContext(clientRunId, evt.runId);
|
|
2115
|
-
const agentPayload = {
|
|
2116
|
-
...eventForClients,
|
|
2117
|
-
...sessionKey ? { sessionKey } : {},
|
|
2118
|
-
...heartbeatAgentCtx?.isHeartbeat ? { isHeartbeat: true } : {}
|
|
2119
|
-
};
|
|
2120
|
-
const last = agentRunSeq.get(evt.runId) ?? 0;
|
|
2121
|
-
const isToolEvent = evt.stream === "tool";
|
|
2122
|
-
const toolVerbose = isToolEvent ? resolveToolVerboseLevel(evt.runId, sessionKey) : "off";
|
|
2123
|
-
const toolPayload = isToolEvent && toolVerbose !== "full" ? (() => {
|
|
2124
|
-
const data = evt.data ? { ...evt.data } : {};
|
|
2125
|
-
delete data.result;
|
|
2126
|
-
delete data.partialResult;
|
|
2127
|
-
return sessionKey ? {
|
|
2128
|
-
...eventForClients,
|
|
2129
|
-
sessionKey,
|
|
2130
|
-
data
|
|
2131
|
-
} : {
|
|
2132
|
-
...eventForClients,
|
|
2133
|
-
data
|
|
2134
|
-
};
|
|
2135
|
-
})() : agentPayload;
|
|
2136
|
-
if (evt.seq !== last + 1) broadcast("agent", {
|
|
2137
|
-
runId: eventRunId,
|
|
2138
|
-
stream: "error",
|
|
2139
|
-
ts: Date.now(),
|
|
2140
|
-
sessionKey,
|
|
2141
|
-
data: {
|
|
2142
|
-
reason: "seq gap",
|
|
2143
|
-
expected: last + 1,
|
|
2144
|
-
received: evt.seq
|
|
2145
|
-
}
|
|
2146
|
-
});
|
|
2147
|
-
agentRunSeq.set(evt.runId, evt.seq);
|
|
2148
|
-
if (isToolEvent) {
|
|
2149
|
-
const recipients = toolEventRecipients.get(evt.runId);
|
|
2150
|
-
if (recipients && recipients.size > 0) broadcastToConnIds("agent", toolPayload, recipients);
|
|
2151
|
-
} else broadcast("agent", agentPayload);
|
|
2152
|
-
const lifecyclePhase = evt.stream === "lifecycle" && typeof evt.data?.phase === "string" ? evt.data.phase : null;
|
|
2153
|
-
if (lifecyclePhase === "start" && sessionKey && !isAborted) {
|
|
2154
|
-
if (!resolveHeartbeatContext(clientRunId, evt.runId)?.isHeartbeat) broadcast("chat", {
|
|
2155
|
-
runId: clientRunId,
|
|
2156
|
-
sessionKey,
|
|
2157
|
-
seq: evt.seq,
|
|
2158
|
-
state: "thinking"
|
|
2159
|
-
});
|
|
2160
|
-
}
|
|
2161
|
-
if (lifecyclePhase && sessionKey && sessionKey.includes(":subagent:")) {
|
|
2162
|
-
if (lifecyclePhase === "start") broadcast("subagent", {
|
|
2163
|
-
phase: "started",
|
|
2164
|
-
sessionKey,
|
|
2165
|
-
runId: clientRunId
|
|
2166
|
-
});
|
|
2167
|
-
else if (lifecyclePhase === "end" || lifecyclePhase === "error") broadcast("subagent", {
|
|
2168
|
-
phase: "completed",
|
|
2169
|
-
sessionKey,
|
|
2170
|
-
runId: clientRunId
|
|
2171
|
-
});
|
|
2172
|
-
}
|
|
2173
|
-
if (sessionKey) {
|
|
2174
|
-
if (!isToolEvent || toolVerbose !== "off") nodeSendToSession(sessionKey, "agent", isToolEvent ? toolPayload : agentPayload);
|
|
2175
|
-
if (!isAborted && evt.stream === "assistant" && typeof evt.data?.text === "string") {
|
|
2176
|
-
const deltaText = typeof evt.data?.delta === "string" && evt.data.delta ? evt.data.delta : evt.data.text;
|
|
2177
|
-
emitChatDelta(sessionKey, clientRunId, evt.runId, evt.seq, deltaText);
|
|
2178
|
-
} else if (!isAborted && (lifecyclePhase === "end" || lifecyclePhase === "error")) if (chatLink) {
|
|
2179
|
-
const finished = chatRunState.registry.shift(evt.runId);
|
|
2180
|
-
if (!finished) {
|
|
2181
|
-
clearAgentRunContext(evt.runId);
|
|
2182
|
-
return;
|
|
2183
|
-
}
|
|
2184
|
-
emitChatFinal(finished.sessionKey, finished.clientRunId, evt.runId, evt.seq, lifecyclePhase === "error" ? "error" : "done", evt.data?.error);
|
|
2185
|
-
} else emitChatFinal(sessionKey, eventRunId, evt.runId, evt.seq, lifecyclePhase === "error" ? "error" : "done", evt.data?.error);
|
|
2186
|
-
else if (isAborted && (lifecyclePhase === "end" || lifecyclePhase === "error")) {
|
|
2187
|
-
chatRunState.abortedRuns.delete(clientRunId);
|
|
2188
|
-
chatRunState.abortedRuns.delete(evt.runId);
|
|
2189
|
-
chatRunState.buffers.delete(clientRunId);
|
|
2190
|
-
chatRunState.deltaSentAt.delete(clientRunId);
|
|
2191
|
-
if (chatLink) chatRunState.registry.remove(evt.runId, clientRunId, sessionKey);
|
|
2192
|
-
}
|
|
2193
|
-
}
|
|
2194
|
-
if (lifecyclePhase === "end" || lifecyclePhase === "error") {
|
|
2195
|
-
toolEventRecipients.markFinal(evt.runId);
|
|
2196
|
-
clearAgentRunContext(evt.runId);
|
|
2197
|
-
agentRunSeq.delete(evt.runId);
|
|
2198
|
-
agentRunSeq.delete(clientRunId);
|
|
2199
|
-
}
|
|
2200
|
-
};
|
|
2201
|
-
}
|
|
2202
|
-
|
|
2203
1855
|
//#endregion
|
|
2204
1856
|
//#region src/hooks/gmail-watcher.ts
|
|
2205
1857
|
/**
|
|
@@ -12213,7 +11865,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
12213
11865
|
});
|
|
12214
11866
|
let glassUiBridgeCleanup = null;
|
|
12215
11867
|
if (!minimalTestGateway) {
|
|
12216
|
-
const { createGlassUiBridge } = await import("./glass-ui-ws-
|
|
11868
|
+
const { createGlassUiBridge } = await import("./glass-ui-ws-CLyPSA_9.js");
|
|
12217
11869
|
glassUiBridgeCleanup = createGlassUiBridge({
|
|
12218
11870
|
wss: glassUiWss,
|
|
12219
11871
|
context: gatewayRequestContext,
|