@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.
Files changed (54) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/bundled/boot-md/handler.js +4 -4
  3. package/dist/bundled/session-memory/handler.js +4 -4
  4. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  5. package/dist/{chrome-O5GtGEaR.js → chrome-CCtr79A5.js} +4 -4
  6. package/dist/{chrome-B7_foWil.js → chrome-CLdjGAF1.js} +4 -4
  7. package/dist/{command-registry-DmjX-MJb.js → command-registry-DtivbkBg.js} +4 -4
  8. package/dist/{completion-cli-CKczmer5.js → completion-cli-DAtKJGz_.js} +1 -1
  9. package/dist/{completion-cli-DezSeZQA.js → completion-cli-M9mpw_DS.js} +2 -2
  10. package/dist/control-ui/js/app.js +34 -2
  11. package/dist/{deliver-BMg6XjUA.js → deliver-D0zCpBS2.js} +4 -4
  12. package/dist/{deliver-Cxzii_el.js → deliver-aqjVfua8.js} +4 -4
  13. package/dist/{doctor-completion-AGw1egU_.js → doctor-completion-BlxU7_DJ.js} +1 -1
  14. package/dist/{doctor-completion-BCVASe0n.js → doctor-completion-DLx2ecZ2.js} +1 -1
  15. package/dist/entry.js +1 -1
  16. package/dist/extensionAPI.js +4 -4
  17. package/dist/{gateway-cli-CvFiUm5D.js → gateway-cli-BDVuQ5k9.js} +6 -354
  18. package/dist/{gateway-cli-BZXfKM1n.js → gateway-cli-CjY_Ct2M.js} +6 -354
  19. package/dist/{glass-ui-ws-CHyGj7GA.js → glass-ui-ws-Bs0VbFCC.js} +1 -1
  20. package/dist/{glass-ui-ws-BSTHY5PU.js → glass-ui-ws-CLyPSA_9.js} +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/llm-slug-generator.js +4 -4
  23. package/dist/{manager-BWi2hK4Y.js → manager-3gF-gaOU.js} +1 -1
  24. package/dist/{manager-BoTf2TBM.js → manager-Do_LVG9R.js} +1 -1
  25. package/dist/{onboard-BzRDv60Y.js → onboard-lFeJdiGp.js} +1 -1
  26. package/dist/{onboard-CHrTg-R0.js → onboard-zwQ2t4TE.js} +1 -1
  27. package/dist/{onboarding-ClbxBHpB.js → onboarding-C0kL3Y5v.js} +1 -1
  28. package/dist/{onboarding-BGwkx8NB.js → onboarding-CaHVfCVn.js} +1 -1
  29. package/dist/{onboarding.finalize-D6zND3C7.js → onboarding.finalize-DwXxdw74.js} +3 -3
  30. package/dist/{onboarding.finalize-BnIBZwze.js → onboarding.finalize-vT6fRWsB.js} +4 -4
  31. package/dist/{pi-embedded-L-sMlPsa.js → pi-embedded-JU-n_Ppj.js} +10 -10
  32. package/dist/plugin-sdk/gateway/server-chat.d.ts +47 -0
  33. package/dist/{program-B8S2KFzC.js → program-C1bTgU2q.js} +2 -2
  34. package/dist/{program-context-DCb3cVEC.js → program-context-BHvgRRy_.js} +6 -6
  35. package/dist/{prompt-select-styled-BJ3NsTmX.js → prompt-select-styled--PI8fuuB.js} +1 -1
  36. package/dist/{prompt-select-styled-ZdXAuRQQ.js → prompt-select-styled-DawD9uin.js} +1 -1
  37. package/dist/{pw-ai-B9riepO_.js → pw-ai-BlFwd1fC.js} +1 -1
  38. package/dist/{pw-ai-CYE0188Y.js → pw-ai-Cq1WlDax.js} +1 -1
  39. package/dist/{register.maintenance-CX4sIokB.js → register.maintenance-D0NfR0wv.js} +5 -5
  40. package/dist/{register.maintenance-BBxWlFhs.js → register.maintenance-fFzETZM-.js} +4 -4
  41. package/dist/{register.onboard-UzFm__iV.js → register.onboard-C0eFmAVL.js} +2 -2
  42. package/dist/{register.onboard-Be8PMN1Z.js → register.onboard-C7aJLoQc.js} +2 -2
  43. package/dist/{register.setup-w0_6rARS.js → register.setup-CRhnePOD.js} +2 -2
  44. package/dist/{register.setup-Dq7WlLOL.js → register.setup-XpvVOl8-.js} +2 -2
  45. package/dist/{register.subclis-Cb1ErrVQ.js → register.subclis-BFq9K0q9.js} +3 -3
  46. package/dist/{run-main-DmC4wWlp.js → run-main-JPtR4nYb.js} +3 -3
  47. package/dist/{server-methods-C97G9dYe.js → server-methods-Dj3PCErz.js} +360 -4
  48. package/dist/{server-methods-DFt60s1H.js → server-methods-RegE5bVx.js} +360 -4
  49. package/dist/{synthesis-DA7kfAUJ.js → synthesis-CNYpM3bL.js} +4 -4
  50. package/dist/{synthesis-CPZoVKlB.js → synthesis-CP97tsyU.js} +4 -4
  51. package/dist/{unified-runner-BdN9pHa8.js → unified-runner-Bjd_KpAr.js} +10 -10
  52. package/dist/{update-cli-Bg3c9ORr.js → update-cli-DPsa1UFx.js} +5 -5
  53. package/dist/{update-cli-DZtbV25O.js → update-cli-bgziGI6r.js} +4 -4
  54. 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, F as classifyOutboundMessage, 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, n as countActiveRunsForSession, 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";
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 { i as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-DN4W-XdV.js";
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, u as resolveHeartbeatVisibility } from "./health-vDQ4nRJB.js";
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-ClbxBHpB.js";
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-C97G9dYe.js";
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-BSTHY5PU.js");
11868
+ const { createGlassUiBridge } = await import("./glass-ui-ws-CLyPSA_9.js");
12217
11869
  glassUiBridgeCleanup = createGlassUiBridge({
12218
11870
  wss: glassUiWss,
12219
11871
  context: gatewayRequestContext,