@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
@@ -1,6 +1,7 @@
1
1
  import { g as resolveStateDir, t as CONFIG_PATH } from "./paths-Cqn-zk3M.js";
2
2
  import { g as resolveUserPath, r as clamp, w as isPlainObject, z as getResolvedLoggerSettings } from "./utils-BwhNP0do.js";
3
- import { $ as normalizeCronJobCreate, $n as resolveTtsProviderOrder, A as loadSessionEntry, An as clearSessionQueues, Bt as resolveSendPolicy, C as listTasksInWorkdir, Cn as listSubagentRunsForRequester, D as listAgentsForGateway, Dt as loadProviderUsageSummary, F as ensureOutboundSessionEntry, Hn as resolveUserTimezone, I as resolveOutboundSessionRoute, Jn as isTtsProviderConfigured, Jt as parseVerboseOverride, K as formatDoctorNonInteractiveHint, Kn as getTtsProvider, Kt as applyModelOverrideToSessionEntry, M as resolveGatewaySessionStoreTarget, Mn as abortEmbeddedPiRun, N as resolveSessionModelRef, O as listSessionsFromStore, Pn as waitForEmbeddedPiRunEnd, Qn as resolveTtsPrefsPath, Sn as listDescendantRunsForRequester, T as canonicalizeSpawnedByForAgent, Tn as resolveAgentTimeoutMs, V as normalizePollInput, Xn as resolveTtsAutoMode, Yn as resolveTtsApiKey, Z as writeRestartSentinel, Zn as resolveTtsConfig, _n as isAbortTrigger, _t as applyBrowserProxyPaths, an as prepareAgentRun, b as buildAgentTurnParams, er as setTtsEnabled, et as normalizeCronJobPatch, f as getChannelActivity, g as buildGlassUiProfile, gn as formatZonedTimestamp, ir as OPENAI_TTS_VOICES, j as pruneLegacyStoreKeys, k as loadCombinedSessionStoreForGateway, m as createReplyDispatcher, mn as normalizeGroupActivation, nr as textToSpeech, on as enqueueSystemEvent, pn as BARE_SESSION_RESET_PROMPT, qn as isTtsEnabled, qt as applyVerboseOverride, rr as OPENAI_TTS_MODELS, s as loadSymiPlugins, sn as isSystemEventContextChanged, tr as setTtsProvider, vn as stopSubagentsForRequester, vr as onAgentEvent, vt as persistBrowserProxyFiles, wt as scheduleGatewaySigusr1Restart, x as prepareReplyTurn, y as runUnifiedTurn, yr as registerAgentRunContext, z as resolveOutboundTarget, zt as normalizeSendPolicy } from "./unified-runner-BX17do1W.js";
3
+ import { i as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-C8-rnk4H.js";
4
+ import { $ as normalizeCronJobCreate, $n as resolveTtsProviderOrder, A as loadSessionEntry, An as clearSessionQueues, Bt as resolveSendPolicy, C as listTasksInWorkdir, Cn as listSubagentRunsForRequester, D as listAgentsForGateway, Dr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, Dt as loadProviderUsageSummary, F as ensureOutboundSessionEntry, Hn as resolveUserTimezone, I as resolveOutboundSessionRoute, Jn as isTtsProviderConfigured, Jt as parseVerboseOverride, K as formatDoctorNonInteractiveHint, Kn as getTtsProvider, Kt as applyModelOverrideToSessionEntry, M as resolveGatewaySessionStoreTarget, Mn as abortEmbeddedPiRun, N as resolveSessionModelRef, O as listSessionsFromStore, Pn as waitForEmbeddedPiRunEnd, Qn as resolveTtsPrefsPath, Sn as listDescendantRunsForRequester, T as canonicalizeSpawnedByForAgent, Tn as resolveAgentTimeoutMs, V as normalizePollInput, Xn as resolveTtsAutoMode, Yn as resolveTtsApiKey, Z as writeRestartSentinel, Zn as resolveTtsConfig, _n as isAbortTrigger, _r as getAgentRunContext, _t as applyBrowserProxyPaths, an as prepareAgentRun, b as buildAgentTurnParams, bn as countActiveRunsForSession, br as classifyOutboundMessage, er as setTtsEnabled, et as normalizeCronJobPatch, f as getChannelActivity, g as buildGlassUiProfile, gn as formatZonedTimestamp, ir as OPENAI_TTS_VOICES, j as pruneLegacyStoreKeys, k as loadCombinedSessionStoreForGateway, m as createReplyDispatcher, mn as normalizeGroupActivation, nr as textToSpeech, on as enqueueSystemEvent, pn as BARE_SESSION_RESET_PROMPT, qn as isTtsEnabled, qt as applyVerboseOverride, rr as OPENAI_TTS_MODELS, s as loadSymiPlugins, sn as isSystemEventContextChanged, tr as setTtsProvider, vn as stopSubagentsForRequester, vr as onAgentEvent, vt as persistBrowserProxyFiles, wt as scheduleGatewaySigusr1Restart, x as prepareReplyTurn, y as runUnifiedTurn, yr as registerAgentRunContext, z as resolveOutboundTarget, zt as normalizeSendPolicy } from "./unified-runner-BX17do1W.js";
4
5
  import { C as triggerInternalHook, d as getActivePluginRegistry, r as DEFAULT_CHAT_CHANNEL, t as CHANNEL_IDS, x as createInternalHookEvent } from "./registry-DVCe2mTM.js";
5
6
  import { f as defaultRuntime, t as createSubsystemLogger } from "./subsystem-C22TrusW.js";
6
7
  import { Et as normalizeSecretInput, G as resolveSubagentConfiguredModelSelection, H as resolveDefaultModelForAgent, q as resolveThinkingDefault, z as resolveAllowedModelRef } from "./auth-profiles-BDYmaplg.js";
@@ -16,7 +17,7 @@ import { f as GATEWAY_CLIENT_CAPS, g as hasGatewayClientCap, i as isGatewayMessa
16
17
  import { n as listChannelPlugins, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-CVy7TEFI.js";
17
18
  import { c as resolveStorePath, n as resolveSessionFilePath, r as resolveSessionFilePathOptions, s as resolveSessionTranscriptsDirForAgent } from "./paths-CdGa1jlU.js";
18
19
  import { i as normalizeInputProvenance } from "./input-provenance-iBlnbS1d.js";
19
- import { a as normalizeElevatedLevel, c as normalizeUsageDisplay, d as supportsXHighThinking, n as formatXHighModelHint, o as normalizeReasoningLevel, s as normalizeThinkLevel, t as formatThinkingLevels } from "./thinking-BTh3b5vY.js";
20
+ import { a as normalizeElevatedLevel, c as normalizeUsageDisplay, d as supportsXHighThinking, l as normalizeVerboseLevel, n as formatXHighModelHint, o as normalizeReasoningLevel, s as normalizeThinkLevel, t as formatThinkingLevels } from "./thinking-BTh3b5vY.js";
20
21
  import { h as getGlobalHookRunner, o as normalizeReplyPayloadsForDelivery, t as deliverOutboundPayloads } from "./deliver-CCNTT73z.js";
21
22
  import { i as loadSessionUsageTimeSeries, n as loadCostUsageSummary, r as loadSessionCostSummary, t as discoverAllSessions } from "./session-cost-usage-Dsr-Ma1K.js";
22
23
  import { n as createBrowserRouteDispatcher } from "./with-timeout-D1RTXHZO.js";
@@ -39,7 +40,7 @@ import { t as buildChannelAccountSnapshot } from "./status-DSFXGZ2N.js";
39
40
  import { w as resolveAssistantAvatarUrl } from "./onboard-helpers-ClA4h5_K.js";
40
41
  import { o as isNodeCommandAllowed, s as resolveNodeCommandAllowlist } from "./audit-CCWHhR0Z.js";
41
42
  import { n as getStatusSummary } from "./status-VrUpaIhD.js";
42
- import { f as abortHeartbeatRunForSession, s as setHeartbeatsEnabled, u as getLastHeartbeatEvent } from "./health-OGl_XbRn.js";
43
+ import { f as abortHeartbeatRunForSession, l as resolveHeartbeatVisibility, s as setHeartbeatsEnabled, u as getLastHeartbeatEvent } from "./health-OGl_XbRn.js";
43
44
  import { m as normalizeUpdateChannel } from "./update-check-g7MoURZH.js";
44
45
  import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-DlP4T9Pl.js";
45
46
  import { i as resolveAgentOutboundTarget, r as resolveAgentDeliveryPlan, t as agentCommand } from "./agent-DKz-M9N_.js";
@@ -405,6 +406,355 @@ function startGatewayConfigReloader(opts) {
405
406
  } };
406
407
  }
407
408
 
409
+ //#endregion
410
+ //#region src/gateway/server-chat.ts
411
+ function resolveHeartbeatAckMaxChars() {
412
+ try {
413
+ const cfg = loadConfig();
414
+ return Math.max(0, cfg.agents?.defaults?.heartbeat?.ackMaxChars ?? DEFAULT_HEARTBEAT_ACK_MAX_CHARS);
415
+ } catch {
416
+ return DEFAULT_HEARTBEAT_ACK_MAX_CHARS;
417
+ }
418
+ }
419
+ function resolveHeartbeatContext(runId, sourceRunId) {
420
+ const primary = getAgentRunContext(runId);
421
+ if (primary?.isHeartbeat) return primary;
422
+ if (sourceRunId && sourceRunId !== runId) {
423
+ const source = getAgentRunContext(sourceRunId);
424
+ if (source?.isHeartbeat) return source;
425
+ }
426
+ return primary;
427
+ }
428
+ /**
429
+ * Check if heartbeat ACK/noise should be hidden from interactive chat surfaces.
430
+ */
431
+ function shouldHideHeartbeatChatOutput(runId, sourceRunId) {
432
+ if (!resolveHeartbeatContext(runId, sourceRunId)?.isHeartbeat) return false;
433
+ try {
434
+ return !resolveHeartbeatVisibility({
435
+ cfg: loadConfig(),
436
+ channel: "webchat"
437
+ }).showOk;
438
+ } catch {
439
+ return true;
440
+ }
441
+ }
442
+ function createChatRunRegistry() {
443
+ const chatRunSessions = /* @__PURE__ */ new Map();
444
+ const add = (sessionId, entry) => {
445
+ const queue = chatRunSessions.get(sessionId);
446
+ if (queue) queue.push(entry);
447
+ else chatRunSessions.set(sessionId, [entry]);
448
+ };
449
+ const peek = (sessionId) => chatRunSessions.get(sessionId)?.[0];
450
+ const shift = (sessionId) => {
451
+ const queue = chatRunSessions.get(sessionId);
452
+ if (!queue || queue.length === 0) return;
453
+ const entry = queue.shift();
454
+ if (!queue.length) chatRunSessions.delete(sessionId);
455
+ return entry;
456
+ };
457
+ const remove = (sessionId, clientRunId, sessionKey) => {
458
+ const queue = chatRunSessions.get(sessionId);
459
+ if (!queue || queue.length === 0) return;
460
+ const idx = queue.findIndex((entry) => entry.clientRunId === clientRunId && (sessionKey ? entry.sessionKey === sessionKey : true));
461
+ if (idx < 0) return;
462
+ const [entry] = queue.splice(idx, 1);
463
+ if (!queue.length) chatRunSessions.delete(sessionId);
464
+ return entry;
465
+ };
466
+ const clear = () => {
467
+ chatRunSessions.clear();
468
+ };
469
+ return {
470
+ add,
471
+ peek,
472
+ shift,
473
+ remove,
474
+ clear
475
+ };
476
+ }
477
+ function createChatRunState() {
478
+ const registry = createChatRunRegistry();
479
+ const buffers = /* @__PURE__ */ new Map();
480
+ const deltaSentAt = /* @__PURE__ */ new Map();
481
+ const pendingDeltaText = /* @__PURE__ */ new Map();
482
+ const abortedRuns = /* @__PURE__ */ new Map();
483
+ const clear = () => {
484
+ registry.clear();
485
+ buffers.clear();
486
+ deltaSentAt.clear();
487
+ pendingDeltaText.clear();
488
+ abortedRuns.clear();
489
+ };
490
+ return {
491
+ registry,
492
+ buffers,
493
+ deltaSentAt,
494
+ pendingDeltaText,
495
+ abortedRuns,
496
+ clear
497
+ };
498
+ }
499
+ const TOOL_EVENT_RECIPIENT_TTL_MS = 600 * 1e3;
500
+ const TOOL_EVENT_RECIPIENT_FINAL_GRACE_MS = 30 * 1e3;
501
+ function createToolEventRecipientRegistry() {
502
+ const recipients = /* @__PURE__ */ new Map();
503
+ const prune = () => {
504
+ if (recipients.size === 0) return;
505
+ const now = Date.now();
506
+ 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);
507
+ };
508
+ const add = (runId, connId) => {
509
+ if (!runId || !connId) return;
510
+ const now = Date.now();
511
+ const existing = recipients.get(runId);
512
+ if (existing) {
513
+ existing.connIds.add(connId);
514
+ existing.updatedAt = now;
515
+ } else recipients.set(runId, {
516
+ connIds: new Set([connId]),
517
+ updatedAt: now
518
+ });
519
+ prune();
520
+ };
521
+ const get = (runId) => {
522
+ const entry = recipients.get(runId);
523
+ if (!entry) return;
524
+ entry.updatedAt = Date.now();
525
+ prune();
526
+ return entry.connIds;
527
+ };
528
+ const markFinal = (runId) => {
529
+ const entry = recipients.get(runId);
530
+ if (!entry) return;
531
+ entry.finalizedAt = Date.now();
532
+ prune();
533
+ };
534
+ return {
535
+ add,
536
+ get,
537
+ markFinal
538
+ };
539
+ }
540
+ function createAgentEventHandler({ broadcast, broadcastToConnIds, nodeSendToSession, agentRunSeq, chatRunState, resolveSessionKeyForRun, clearAgentRunContext, toolEventRecipients }) {
541
+ const emitChatDelta = (sessionKey, clientRunId, sourceRunId, seq, text) => {
542
+ if (isSilentReplyText(text, SILENT_REPLY_TOKEN)) return;
543
+ const prev = chatRunState.buffers.get(clientRunId) ?? "";
544
+ chatRunState.buffers.set(clientRunId, prev + text);
545
+ if (shouldHideHeartbeatChatOutput(clientRunId, sourceRunId)) return;
546
+ const now = Date.now();
547
+ if (now - (chatRunState.deltaSentAt.get(clientRunId) ?? 0) < 150) {
548
+ chatRunState.pendingDeltaText.set(clientRunId, (chatRunState.pendingDeltaText.get(clientRunId) ?? "") + text);
549
+ return;
550
+ }
551
+ const buffered = chatRunState.pendingDeltaText.get(clientRunId) ?? "";
552
+ chatRunState.pendingDeltaText.delete(clientRunId);
553
+ const fullText = buffered + text;
554
+ chatRunState.deltaSentAt.set(clientRunId, now);
555
+ const payload = {
556
+ runId: clientRunId,
557
+ sessionKey,
558
+ seq,
559
+ state: "delta",
560
+ ...resolveHeartbeatContext(clientRunId, sourceRunId)?.isHeartbeat ? { isHeartbeat: true } : {},
561
+ message: {
562
+ role: "assistant",
563
+ content: [{
564
+ type: "text",
565
+ text: fullText
566
+ }],
567
+ timestamp: now
568
+ }
569
+ };
570
+ broadcast("chat", payload, { dropIfSlow: true });
571
+ nodeSendToSession(sessionKey, "chat", payload);
572
+ };
573
+ const emitChatFinal = (sessionKey, clientRunId, sourceRunId, seq, jobState, error) => {
574
+ const remainingDelta = chatRunState.pendingDeltaText.get(clientRunId);
575
+ if (remainingDelta && !shouldHideHeartbeatChatOutput(clientRunId, sourceRunId)) {
576
+ const flushPayload = {
577
+ runId: clientRunId,
578
+ sessionKey,
579
+ seq,
580
+ state: "delta",
581
+ ...resolveHeartbeatContext(clientRunId, sourceRunId)?.isHeartbeat ? { isHeartbeat: true } : {},
582
+ message: {
583
+ role: "assistant",
584
+ content: [{
585
+ type: "text",
586
+ text: remainingDelta
587
+ }],
588
+ timestamp: Date.now()
589
+ }
590
+ };
591
+ broadcast("chat", flushPayload);
592
+ nodeSendToSession(sessionKey, "chat", flushPayload);
593
+ }
594
+ chatRunState.pendingDeltaText.delete(clientRunId);
595
+ const bufferedText = chatRunState.buffers.get(clientRunId)?.trim() ?? "";
596
+ const heartbeatCtx = resolveHeartbeatContext(clientRunId, sourceRunId);
597
+ const isHeartbeatRun = !!heartbeatCtx?.isHeartbeat;
598
+ const heartbeatHidden = isHeartbeatRun && shouldHideHeartbeatChatOutput(clientRunId, sourceRunId);
599
+ const filterResult = isHeartbeatRun && !heartbeatHidden ? {
600
+ action: "deliver",
601
+ output: bufferedText,
602
+ reason: "deliver"
603
+ } : classifyOutboundMessage(bufferedText, {
604
+ isHeartbeat: heartbeatHidden,
605
+ heartbeatAckMaxChars: resolveHeartbeatAckMaxChars()
606
+ });
607
+ const text = filterResult.output.trim();
608
+ const shouldSuppressSilent = filterResult.action === "drop";
609
+ chatRunState.buffers.delete(clientRunId);
610
+ chatRunState.deltaSentAt.delete(clientRunId);
611
+ if (jobState === "done") {
612
+ const payload = {
613
+ runId: clientRunId,
614
+ sessionKey,
615
+ seq,
616
+ state: "final",
617
+ activeSubagentCount: countActiveRunsForSession(sessionKey),
618
+ ...heartbeatCtx?.isHeartbeat ? { isHeartbeat: true } : {},
619
+ message: text && !shouldSuppressSilent ? {
620
+ role: "assistant",
621
+ content: [{
622
+ type: "text",
623
+ text
624
+ }],
625
+ timestamp: Date.now()
626
+ } : void 0
627
+ };
628
+ broadcast("chat", payload);
629
+ nodeSendToSession(sessionKey, "chat", payload);
630
+ return;
631
+ }
632
+ const payload = {
633
+ runId: clientRunId,
634
+ sessionKey,
635
+ seq,
636
+ state: "error",
637
+ errorMessage: error ? formatForLog(error) : void 0,
638
+ ...heartbeatCtx?.isHeartbeat ? { isHeartbeat: true } : {}
639
+ };
640
+ broadcast("chat", payload);
641
+ nodeSendToSession(sessionKey, "chat", payload);
642
+ };
643
+ const resolveToolVerboseLevel = (runId, sessionKey) => {
644
+ const runVerbose = normalizeVerboseLevel(getAgentRunContext(runId)?.verboseLevel);
645
+ if (runVerbose) return runVerbose;
646
+ if (!sessionKey) return "off";
647
+ try {
648
+ const { cfg, entry } = loadSessionEntry(sessionKey);
649
+ const sessionVerbose = normalizeVerboseLevel(entry?.verboseLevel);
650
+ if (sessionVerbose) return sessionVerbose;
651
+ return normalizeVerboseLevel(cfg.agents?.defaults?.verboseDefault) ?? "off";
652
+ } catch {
653
+ return "off";
654
+ }
655
+ };
656
+ return (evt) => {
657
+ const chatLink = chatRunState.registry.peek(evt.runId);
658
+ const eventSessionKey = typeof evt.sessionKey === "string" && evt.sessionKey.trim() ? evt.sessionKey : void 0;
659
+ const sessionKey = chatLink?.sessionKey ?? eventSessionKey ?? resolveSessionKeyForRun(evt.runId);
660
+ if (sessionKey?.startsWith("temp:")) return;
661
+ const clientRunId = chatLink?.clientRunId ?? evt.runId;
662
+ const eventRunId = chatLink?.clientRunId ?? evt.runId;
663
+ const eventForClients = chatLink ? {
664
+ ...evt,
665
+ runId: eventRunId
666
+ } : evt;
667
+ const isAborted = chatRunState.abortedRuns.has(clientRunId) || chatRunState.abortedRuns.has(evt.runId);
668
+ const heartbeatAgentCtx = resolveHeartbeatContext(clientRunId, evt.runId);
669
+ const agentPayload = {
670
+ ...eventForClients,
671
+ ...sessionKey ? { sessionKey } : {},
672
+ ...heartbeatAgentCtx?.isHeartbeat ? { isHeartbeat: true } : {}
673
+ };
674
+ const last = agentRunSeq.get(evt.runId) ?? 0;
675
+ const isToolEvent = evt.stream === "tool";
676
+ const toolVerbose = isToolEvent ? resolveToolVerboseLevel(evt.runId, sessionKey) : "off";
677
+ const toolPayload = isToolEvent && toolVerbose !== "full" ? (() => {
678
+ const data = evt.data ? { ...evt.data } : {};
679
+ delete data.result;
680
+ delete data.partialResult;
681
+ return sessionKey ? {
682
+ ...eventForClients,
683
+ sessionKey,
684
+ data
685
+ } : {
686
+ ...eventForClients,
687
+ data
688
+ };
689
+ })() : agentPayload;
690
+ if (evt.seq !== last + 1) broadcast("agent", {
691
+ runId: eventRunId,
692
+ stream: "error",
693
+ ts: Date.now(),
694
+ sessionKey,
695
+ ...heartbeatAgentCtx?.isHeartbeat ? { isHeartbeat: true } : {},
696
+ data: {
697
+ reason: "seq gap",
698
+ expected: last + 1,
699
+ received: evt.seq
700
+ }
701
+ });
702
+ agentRunSeq.set(evt.runId, evt.seq);
703
+ if (isToolEvent) {
704
+ const recipients = toolEventRecipients.get(evt.runId);
705
+ if (recipients && recipients.size > 0) broadcastToConnIds("agent", toolPayload, recipients);
706
+ } else broadcast("agent", agentPayload);
707
+ const lifecyclePhase = evt.stream === "lifecycle" && typeof evt.data?.phase === "string" ? evt.data.phase : null;
708
+ if (lifecyclePhase === "start" && sessionKey && !isAborted) {
709
+ if (!resolveHeartbeatContext(clientRunId, evt.runId)?.isHeartbeat) broadcast("chat", {
710
+ runId: clientRunId,
711
+ sessionKey,
712
+ seq: evt.seq,
713
+ state: "thinking"
714
+ });
715
+ }
716
+ if (lifecyclePhase && sessionKey && sessionKey.includes(":subagent:")) {
717
+ if (lifecyclePhase === "start") broadcast("subagent", {
718
+ phase: "started",
719
+ sessionKey,
720
+ runId: clientRunId
721
+ });
722
+ else if (lifecyclePhase === "end" || lifecyclePhase === "error") broadcast("subagent", {
723
+ phase: "completed",
724
+ sessionKey,
725
+ runId: clientRunId
726
+ });
727
+ }
728
+ if (sessionKey) {
729
+ if (!isToolEvent || toolVerbose !== "off") nodeSendToSession(sessionKey, "agent", isToolEvent ? toolPayload : agentPayload);
730
+ if (!isAborted && evt.stream === "assistant" && typeof evt.data?.text === "string") {
731
+ const deltaText = typeof evt.data?.delta === "string" && evt.data.delta ? evt.data.delta : evt.data.text;
732
+ emitChatDelta(sessionKey, clientRunId, evt.runId, evt.seq, deltaText);
733
+ } else if (!isAborted && (lifecyclePhase === "end" || lifecyclePhase === "error")) if (chatLink) {
734
+ const finished = chatRunState.registry.shift(evt.runId);
735
+ if (!finished) {
736
+ clearAgentRunContext(evt.runId);
737
+ return;
738
+ }
739
+ emitChatFinal(finished.sessionKey, finished.clientRunId, evt.runId, evt.seq, lifecyclePhase === "error" ? "error" : "done", evt.data?.error);
740
+ } else emitChatFinal(sessionKey, eventRunId, evt.runId, evt.seq, lifecyclePhase === "error" ? "error" : "done", evt.data?.error);
741
+ else if (isAborted && (lifecyclePhase === "end" || lifecyclePhase === "error")) {
742
+ chatRunState.abortedRuns.delete(clientRunId);
743
+ chatRunState.abortedRuns.delete(evt.runId);
744
+ chatRunState.buffers.delete(clientRunId);
745
+ chatRunState.deltaSentAt.delete(clientRunId);
746
+ if (chatLink) chatRunState.registry.remove(evt.runId, clientRunId, sessionKey);
747
+ }
748
+ }
749
+ if (lifecyclePhase === "end" || lifecyclePhase === "error") {
750
+ toolEventRecipients.markFinal(evt.runId);
751
+ clearAgentRunContext(evt.runId);
752
+ agentRunSeq.delete(evt.runId);
753
+ agentRunSeq.delete(clientRunId);
754
+ }
755
+ };
756
+ }
757
+
408
758
  //#endregion
409
759
  //#region src/cron/run-log.ts
410
760
  function resolveCronRunLogPath(params) {
@@ -498,12 +848,14 @@ function resolveChatRunExpiresAtMs(params) {
498
848
  }
499
849
  function broadcastChatAborted(ops, params) {
500
850
  const { runId, sessionKey, stopReason, partialText } = params;
851
+ const heartbeatCtx = resolveHeartbeatContext(runId);
501
852
  const payload = {
502
853
  runId,
503
854
  sessionKey,
504
855
  seq: (ops.agentRunSeq.get(runId) ?? 0) + 1,
505
856
  state: "aborted",
506
857
  stopReason,
858
+ ...heartbeatCtx?.isHeartbeat ? { isHeartbeat: true } : {},
507
859
  message: partialText ? {
508
860
  role: "assistant",
509
861
  content: [{
@@ -4112,11 +4464,13 @@ function nextChatSeq(context, runId) {
4112
4464
  }
4113
4465
  function broadcastChatFinal(params) {
4114
4466
  const seq = nextChatSeq({ agentRunSeq: params.context.agentRunSeq }, params.runId);
4467
+ const heartbeatCtx = resolveHeartbeatContext(params.runId);
4115
4468
  const payload = {
4116
4469
  runId: params.runId,
4117
4470
  sessionKey: params.sessionKey,
4118
4471
  seq,
4119
4472
  state: "final",
4473
+ ...heartbeatCtx?.isHeartbeat ? { isHeartbeat: true } : {},
4120
4474
  message: params.message
4121
4475
  };
4122
4476
  params.context.broadcast("chat", payload);
@@ -4125,11 +4479,13 @@ function broadcastChatFinal(params) {
4125
4479
  }
4126
4480
  function broadcastChatError(params) {
4127
4481
  const seq = nextChatSeq({ agentRunSeq: params.context.agentRunSeq }, params.runId);
4482
+ const heartbeatCtx = resolveHeartbeatContext(params.runId);
4128
4483
  const payload = {
4129
4484
  runId: params.runId,
4130
4485
  sessionKey: params.sessionKey,
4131
4486
  seq,
4132
4487
  state: "error",
4488
+ ...heartbeatCtx?.isHeartbeat ? { isHeartbeat: true } : {},
4133
4489
  errorMessage: params.errorMessage
4134
4490
  };
4135
4491
  params.context.broadcast("chat", payload);
@@ -9603,4 +9959,4 @@ async function handleGatewayRequest(opts) {
9603
9959
  }
9604
9960
 
9605
9961
  //#endregion
9606
- export { startGatewayConfigReloader as C, resolveCronRunLogPath as S, MAX_PAYLOAD_BYTES as _, loadFavoritesSet as a, abortChatRunById as b, resolveAssistantIdentity as c, formatError as d, loadVoiceWakeConfig as f, MAX_BUFFERED_BYTES as g, HEALTH_REFRESH_INTERVAL_MS as h, safeParseJson as i, listSystemPresence as l, DEDUPE_TTL_MS as m, handleGatewayRequest as n, reconcileFavorites as o, DEDUPE_MAX as p, broadcastPresenceSnapshot as r, DEFAULT_ASSISTANT_IDENTITY as s, coreGatewayHandlers as t, upsertPresence as u, TICK_INTERVAL_MS as v, appendCronRunLog as x, getHandshakeTimeoutMs as y };
9962
+ export { createAgentEventHandler as C, startGatewayConfigReloader as E, resolveCronRunLogPath as S, createToolEventRecipientRegistry as T, MAX_PAYLOAD_BYTES as _, loadFavoritesSet as a, abortChatRunById as b, resolveAssistantIdentity as c, formatError as d, loadVoiceWakeConfig as f, MAX_BUFFERED_BYTES as g, HEALTH_REFRESH_INTERVAL_MS as h, safeParseJson as i, listSystemPresence as l, DEDUPE_TTL_MS as m, handleGatewayRequest as n, reconcileFavorites as o, DEDUPE_MAX as p, broadcastPresenceSnapshot as r, DEFAULT_ASSISTANT_IDENTITY as s, coreGatewayHandlers as t, upsertPresence as u, TICK_INTERVAL_MS as v, createChatRunState as w, appendCronRunLog as x, getHandshakeTimeoutMs as y };
@@ -6,23 +6,23 @@ import "./model-selection-Db-B-8sm.js";
6
6
  import "./reply-prefix-B6WGfnYO.js";
7
7
  import "./github-copilot-token-BbsJ0Qbo.js";
8
8
  import "./local-roots-DiVkgHyh.js";
9
- import { n as runAgentTurn } from "./pi-embedded-L-sMlPsa.js";
9
+ import { n as runAgentTurn } from "./pi-embedded-JU-n_Ppj.js";
10
10
  import "./plugins-DeOy6s9S.js";
11
11
  import "./replies-Cts6obnK.js";
12
- import "./deliver-Cxzii_el.js";
12
+ import "./deliver-aqjVfua8.js";
13
13
  import "./diagnostic-C7jt1JBa.js";
14
14
  import "./diagnostic-session-state-CXCbqRxw.js";
15
15
  import "./pi-model-discovery-nax5dXRY.js";
16
16
  import "./chunk-BnsgQig0.js";
17
17
  import "./ssrf-BgA_8lbe.js";
18
18
  import "./manifest-registry-BR6dqMhM.js";
19
- import "./chrome-O5GtGEaR.js";
19
+ import "./chrome-CLdjGAF1.js";
20
20
  import "./skills-WL4YwE78.js";
21
21
  import "./redact-BwxC4l65.js";
22
22
  import "./errors-DqtQ6JQT.js";
23
23
  import "./thinking-Dr6k_PRi.js";
24
24
  import "./paths-BsT3BvfH.js";
25
- import "./manager-BWi2hK4Y.js";
25
+ import "./manager-3gF-gaOU.js";
26
26
  import "./sqlite-DREkk00W.js";
27
27
  import "./markdown-tables-CHPuKRmT.js";
28
28
  import "./commands-registry-Js1bXBH7.js";
@@ -4,14 +4,14 @@ import "./agent-scope-fkprx0cO.js";
4
4
  import { t as createSubsystemLogger } from "./subsystem-B0nl039t.js";
5
5
  import "./workspace-C3O07_sB.js";
6
6
  import "./tokens-Cf12qNDy.js";
7
- import { t as runAgentTurn } from "./unified-runner-BdN9pHa8.js";
7
+ import { t as runAgentTurn } from "./unified-runner-Bjd_KpAr.js";
8
8
  import "./auth-profiles-CWc_Dn2r.js";
9
9
  import "./github-copilot-token-BUd9oA8x.js";
10
10
  import "./boolean-B8-BqKGQ.js";
11
- import "./deliver-BMg6XjUA.js";
11
+ import "./deliver-D0zCpBS2.js";
12
12
  import "./ssrf-CY_-n5zv.js";
13
13
  import "./manifest-registry-k-LNmNet.js";
14
- import "./chrome-B7_foWil.js";
14
+ import "./chrome-CCtr79A5.js";
15
15
  import "./frontmatter-B5iYTsZP.js";
16
16
  import "./skills-DRWbxzQd.js";
17
17
  import "./redact-DPnDWsnT.js";
@@ -27,7 +27,7 @@ import "./diagnostic-session-state-BkfiP_y6.js";
27
27
  import "./pi-auth-json-CgM-a3Wc.js";
28
28
  import "./pi-model-discovery-BnZgJecJ.js";
29
29
  import "./reply-prefix-D6FmBp9l.js";
30
- import "./manager-BoTf2TBM.js";
30
+ import "./manager-Do_LVG9R.js";
31
31
  import "./sqlite-D9BEt91E.js";
32
32
  import "./markdown-tables-DKggd2Pz.js";
33
33
  import "./commands-registry-DKlZ_8Ms.js";
@@ -9,10 +9,10 @@ import { i as isSilentReplyText, n as SILENT_REPLY_TOKEN, r as SYMIPULSE_TOKEN,
9
9
  import { $ as DEFAULT_MODEL, A as resolveThinkingDefault, B as requireApiKey, C as normalizeModelRef$1, D as resolveDefaultModelForAgent, E as resolveConfiguredModelRef, F as resolveImplicitProviders, G as normalizeSecretInput, H as resolveEnvApiKey, I as OLLAMA_NATIVE_BASE_URL, J as resolveShellEnvFallbackTimeoutMs, K as getShellPathFromLoginShell, L as createOllamaStreamFn, M as normalizeProviders, N as resolveImplicitBedrockProvider, O as resolveModelRefFromString, P as resolveImplicitCopilotProvider, Q as DEFAULT_CONTEXT_TOKENS, R as getApiKeyForModel, S as modelKey, U as resolveModelAuthMode, V as resolveApiKeyForProvider, Z as isTruthyEnvValue, _ as buildAllowedModelSet, a as markAuthProfileFailure, b as findNormalizedProviderValue, c as dedupeProfileIds, d as ensureAuthProfileStore, et as DEFAULT_PROVIDER, f as resolveAuthStorePathForDisplay, i as isProfileInCooldown, j as normalizeGoogleModelId, k as resolveSubagentSpawnModelSelection, l as listProfilesForProvider, m as withFileLock$1, n as resolveAuthProfileOrder, nt as resolveCliName, o as markAuthProfileUsed, p as resolveSymiAgentDir, r as getSoonestCooldownExpiry, rt as resolveAuthProfileDisplayLabel, s as resolveApiKeyForProfile, tt as formatCliCommand, u as markAuthProfileGood, v as buildConfiguredAllowlistKeys, w as normalizeProviderId, y as buildModelAliasIndex, z as getCustomProviderApiKey } from "./auth-profiles-CWc_Dn2r.js";
10
10
  import { a as saveJsonFile, i as loadJsonFile } from "./github-copilot-token-BUd9oA8x.js";
11
11
  import { t as parseBooleanValue$1 } from "./boolean-B8-BqKGQ.js";
12
- import { $ as resolveSandboxContext, $t as resolveBrowserControlAuth, A as isGoogleModelApi, At as resolveSessionResetPolicy, B as isCompactionFailureError, Bt as resolveGroupSessionKey, C as sanitizeImageBlocks, Ct as INPUT_PROVENANCE_KIND_VALUES, D as extractToolResultId, Dt as resolveSessionKey, E as extractToolCallsFromAssistant, Et as normalizeInputProvenance, F as formatRawAssistantErrorForUi, Ft as canonicalizeMainSessionAlias, G as isRateLimitAssistantError, Gt as resolveBrowserConfig, H as isFailoverAssistantError, Ht as resolveSessionLockMaxHoldFromTimeout, I as getApiErrorPayloadFingerprint, J as isTransientHttpError, Jt as saveMediaBuffer, K as isRawApiErrorPayload, Kt as resolveProfile, L as isAuthAssistantError, M as classifyFailoverReason, Mt as resolveThreadFlag, N as formatAssistantErrorText, Nt as DEFAULT_RESET_TRIGGERS, O as downgradeOpenAIReasoningBlocks, Ot as evaluateSessionFreshness, P as formatBillingErrorMessage, Pt as resolveFreshSessionTotalTokens, Q as ensureSandboxWorkspaceForSession, Qt as ensureBrowserControlAuth, R as isBillingAssistantError, Rt as resolveMainSessionKey, S as sanitizeSessionMessagesImages, St as extractToolCallNames, T as resolveImageSanitizationLimits, Tt as hasInterSessionUserProvenance, U as isFailoverErrorMessage, Ut as createBrowserRouteContext, V as isContextOverflowError, Vt as acquireSessionWriteLock, W as isLikelyContextOverflowError, Wt as registerBrowserRoutes, X as parseImageSizeError, Xt as resolveExistingPathsWithinRoot, Y as parseImageDimensionError, Yt as DEFAULT_UPLOAD_DIR, Z as sanitizeUserFacingText, Zt as getBridgeAuthForPort, _ as validateAnthropicTurns, _t as normalizeSessionDeliveryFields, an as mergeAlsoAllowPolicy, at as loadSessionStore, b as isMessagingToolDuplicateNormalized, bt as capArrayByJsonBytes, c as normalizeChannelTargetInput, cn as stripPluginOnlyAllowlist, ct as updateLastRoute, d as parseReplyDirectives, dn as buildBootstrapContextFiles, dt as isCacheEnabled, en as applyOwnerOnlyToolPolicy, et as resolveSandboxRuntimeStatus, f as MEDIA_TOKEN_RE, fn as ensureSessionHeader, ft as resolveCacheTtlMs$1, g as initializeGlobalHookRunner, gt as normalizeDeliveryContext, h as getGlobalHookRunner, hn as sanitizeGoogleTurnOrdering, ht as mergeDeliveryContext, in as expandToolGroups, it as resolveAndPersistSessionFile, j as BILLING_ERROR_USER_MESSAGE, jt as resolveSessionResetType, k as isAntigravityClaude, kt as resolveChannelResetConfig, l as normalizeTargetForProvider, ln as compileGlobPatterns, lt as updateSessionStore, m as parseInlineDirectives$1, mn as resolveBootstrapTotalMaxChars, mt as deliveryContextKey, nn as collectExplicitAllowlist, o as normalizeReplyPayloadsForDelivery, on as normalizeToolName$1, ot as readSessionUpdatedAt, p as splitMediaFromOutput, pn as resolveBootstrapMaxChars, pt as deliveryContextFromSession, q as isTimeoutErrorMessage, qt as getMediaDir, rn as expandPolicyWithPluginGroups, rt as appendAssistantMessageToSessionTranscript, s as buildTargetResolverSignature, sn as resolveToolProfilePolicy, st as recordSessionMetaFromInbound, t as deliverOutboundPayloads, tn as buildPluginToolGroups, tt as extractDeliveryInfo, u as throwIfAborted, un as matchesAnyGlobPattern, ut as updateSessionStoreEntry, v as validateGeminiTurns, w as sanitizeToolResultImages, wt as applyInputProvenanceToUserMessage, x as normalizeTextForComparison, xt as countToolResults, y as pickFallbackThinkingLevel, yt as archiveSessionTranscripts, z as isCloudCodeAssistFormatError, zt as deriveSessionMetaPatch } from "./deliver-BMg6XjUA.js";
12
+ import { $ as resolveSandboxContext, $t as resolveBrowserControlAuth, A as isGoogleModelApi, At as resolveSessionResetPolicy, B as isCompactionFailureError, Bt as resolveGroupSessionKey, C as sanitizeImageBlocks, Ct as INPUT_PROVENANCE_KIND_VALUES, D as extractToolResultId, Dt as resolveSessionKey, E as extractToolCallsFromAssistant, Et as normalizeInputProvenance, F as formatRawAssistantErrorForUi, Ft as canonicalizeMainSessionAlias, G as isRateLimitAssistantError, Gt as resolveBrowserConfig, H as isFailoverAssistantError, Ht as resolveSessionLockMaxHoldFromTimeout, I as getApiErrorPayloadFingerprint, J as isTransientHttpError, Jt as saveMediaBuffer, K as isRawApiErrorPayload, Kt as resolveProfile, L as isAuthAssistantError, M as classifyFailoverReason, Mt as resolveThreadFlag, N as formatAssistantErrorText, Nt as DEFAULT_RESET_TRIGGERS, O as downgradeOpenAIReasoningBlocks, Ot as evaluateSessionFreshness, P as formatBillingErrorMessage, Pt as resolveFreshSessionTotalTokens, Q as ensureSandboxWorkspaceForSession, Qt as ensureBrowserControlAuth, R as isBillingAssistantError, Rt as resolveMainSessionKey, S as sanitizeSessionMessagesImages, St as extractToolCallNames, T as resolveImageSanitizationLimits, Tt as hasInterSessionUserProvenance, U as isFailoverErrorMessage, Ut as createBrowserRouteContext, V as isContextOverflowError, Vt as acquireSessionWriteLock, W as isLikelyContextOverflowError, Wt as registerBrowserRoutes, X as parseImageSizeError, Xt as resolveExistingPathsWithinRoot, Y as parseImageDimensionError, Yt as DEFAULT_UPLOAD_DIR, Z as sanitizeUserFacingText, Zt as getBridgeAuthForPort, _ as validateAnthropicTurns, _t as normalizeSessionDeliveryFields, an as mergeAlsoAllowPolicy, at as loadSessionStore, b as isMessagingToolDuplicateNormalized, bt as capArrayByJsonBytes, c as normalizeChannelTargetInput, cn as stripPluginOnlyAllowlist, ct as updateLastRoute, d as parseReplyDirectives, dn as buildBootstrapContextFiles, dt as isCacheEnabled, en as applyOwnerOnlyToolPolicy, et as resolveSandboxRuntimeStatus, f as MEDIA_TOKEN_RE, fn as ensureSessionHeader, ft as resolveCacheTtlMs$1, g as initializeGlobalHookRunner, gt as normalizeDeliveryContext, h as getGlobalHookRunner, hn as sanitizeGoogleTurnOrdering, ht as mergeDeliveryContext, in as expandToolGroups, it as resolveAndPersistSessionFile, j as BILLING_ERROR_USER_MESSAGE, jt as resolveSessionResetType, k as isAntigravityClaude, kt as resolveChannelResetConfig, l as normalizeTargetForProvider, ln as compileGlobPatterns, lt as updateSessionStore, m as parseInlineDirectives$1, mn as resolveBootstrapTotalMaxChars, mt as deliveryContextKey, nn as collectExplicitAllowlist, o as normalizeReplyPayloadsForDelivery, on as normalizeToolName$1, ot as readSessionUpdatedAt, p as splitMediaFromOutput, pn as resolveBootstrapMaxChars, pt as deliveryContextFromSession, q as isTimeoutErrorMessage, qt as getMediaDir, rn as expandPolicyWithPluginGroups, rt as appendAssistantMessageToSessionTranscript, s as buildTargetResolverSignature, sn as resolveToolProfilePolicy, st as recordSessionMetaFromInbound, t as deliverOutboundPayloads, tn as buildPluginToolGroups, tt as extractDeliveryInfo, u as throwIfAborted, un as matchesAnyGlobPattern, ut as updateSessionStoreEntry, v as validateGeminiTurns, w as sanitizeToolResultImages, wt as applyInputProvenanceToUserMessage, x as normalizeTextForComparison, xt as countToolResults, y as pickFallbackThinkingLevel, yt as archiveSessionTranscripts, z as isCloudCodeAssistFormatError, zt as deriveSessionMetaPatch } from "./deliver-D0zCpBS2.js";
13
13
  import { C as unsetConfigValueAtPath, S as setConfigValueAtPath, T as VERSION, _ as resetConfigOverrides, b as getConfigValueAtPath, c as loadConfig, d as writeConfigFile, f as validateConfigObjectWithPlugins, g as getConfigOverrides, h as validateJsonSchemaValue, i as isBlockedHostnameOrIp, l as readConfigFileSnapshot, m as parseDurationMs, o as normalizeHostname, t as SsrFBlockedError, u as resolveConfigSnapshotHash, v as setConfigOverride, w as DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH, x as parseConfigPath, y as unsetConfigOverride } from "./ssrf-CY_-n5zv.js";
14
14
  import { a as applyTestPluginDefaults, c as resolveMemorySlotDecision, d as isDangerousHostEnvVarName, i as safeStatSync, n as discoverSymiPlugins, o as normalizePluginsConfig, r as isPathInside, s as resolveEnableState, t as loadPluginManifestRegistry, u as isPathInsideWithRealpath } from "./manifest-registry-k-LNmNet.js";
15
- import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-B7_foWil.js";
15
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-CCtr79A5.js";
16
16
  import { l as parseFrontmatterBlock } from "./frontmatter-B5iYTsZP.js";
17
17
  import { c as assertSandboxPath, d as resolveSandboxedMediaSource, f as applySkillEnvOverrides, i as resolveSkillsPromptForRun, l as resolveSandboxInputPath, n as buildWorkspaceSkillSnapshot, p as applySkillEnvOverridesFromSnapshot, r as loadWorkspaceSkillEntries, s as assertMediaNotDataUrl } from "./skills-DRWbxzQd.js";
18
18
  import { n as redactToolDetail } from "./redact-DPnDWsnT.js";
@@ -31,7 +31,7 @@ import { n as getDiagnosticSessionState } from "./diagnostic-session-state-BkfiP
31
31
  import { t as ensurePiAuthJsonFromAuthProfiles } from "./pi-auth-json-CgM-a3Wc.js";
32
32
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-BnZgJecJ.js";
33
33
  import { a as resolveEffectiveMessagesConfig, i as resolveAckReaction, o as resolveHumanDelayConfig, r as resolveResponsePrefixTemplate, t as createReplyPrefixOptions } from "./reply-prefix-D6FmBp9l.js";
34
- import { a as parseGeminiAuth, c as resolveMemorySearchConfig, i as resolveOllamaBaseUrl, n as retryAsync, o as collectProviderApiKeysForExecution, r as probeOllamaEmbeddingModels, s as executeWithApiKeyRotation } from "./manager-BoTf2TBM.js";
34
+ import { a as parseGeminiAuth, c as resolveMemorySearchConfig, i as resolveOllamaBaseUrl, n as retryAsync, o as collectProviderApiKeysForExecution, r as probeOllamaEmbeddingModels, s as executeWithApiKeyRotation } from "./manager-Do_LVG9R.js";
35
35
  import { c as normalizeExtraMemoryPaths, f as runTasksWithConcurrency, s as listMemoryFiles } from "./internal-DhqYabcE.js";
36
36
  import { n as resolveMarkdownTableMode } from "./markdown-tables-DKggd2Pz.js";
37
37
  import { a as shouldHandleTextCommands, c as resolveNativeCommandsEnabled, i as normalizeCommandBody, l as resolveNativeSkillsEnabled, n as listChatCommands, o as isCommandFlagEnabled, r as listChatCommandsForConfig, s as isRestartEnabled } from "./commands-registry-DKlZ_8Ms.js";
@@ -54,7 +54,7 @@ import crypto, { X509Certificate, createHash, createHmac, randomBytes, randomUUI
54
54
  import { complete, completeSimple, createAssistantMessageEventStream, streamSimple } from "@mariozechner/pi-ai";
55
55
  import AjvPkg from "ajv";
56
56
  import { CURRENT_SESSION_VERSION, DefaultResourceLoader, SessionManager, SettingsManager, codingTools, createAgentSession, createEditTool, createReadTool, createWriteTool, estimateTokens, generateSummary, readTool } from "@mariozechner/pi-coding-agent";
57
- import { WebSocket as WebSocket$1 } from "ws";
57
+ import { WebSocket } from "ws";
58
58
  import { Buffer as Buffer$1 } from "node:buffer";
59
59
  import { EdgeTTS } from "node-edge-tts";
60
60
  import { createJiti } from "jiti";
@@ -3663,7 +3663,7 @@ async function getMemorySearchManager(params) {
3663
3663
  const wrapper = new FallbackMemoryManager({
3664
3664
  primary,
3665
3665
  fallbackFactory: async () => {
3666
- const { MemoryIndexManager } = await import("./manager-BoTf2TBM.js").then((n) => n.t);
3666
+ const { MemoryIndexManager } = await import("./manager-Do_LVG9R.js").then((n) => n.t);
3667
3667
  return await MemoryIndexManager.get(params);
3668
3668
  }
3669
3669
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -3676,7 +3676,7 @@ async function getMemorySearchManager(params) {
3676
3676
  }
3677
3677
  }
3678
3678
  try {
3679
- const { MemoryIndexManager } = await import("./manager-BoTf2TBM.js").then((n) => n.t);
3679
+ const { MemoryIndexManager } = await import("./manager-Do_LVG9R.js").then((n) => n.t);
3680
3680
  return { manager: await MemoryIndexManager.get(params) };
3681
3681
  } catch (err) {
3682
3682
  return {
@@ -8827,7 +8827,7 @@ var GatewayClient = class {
8827
8827
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
8828
8828
  });
8829
8829
  }
8830
- this.ws = new WebSocket$1(url, wsOptions);
8830
+ this.ws = new WebSocket(url, wsOptions);
8831
8831
  this.ws.on("open", () => {
8832
8832
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
8833
8833
  const tlsError = this.validateTlsFingerprint();
@@ -9046,7 +9046,7 @@ var GatewayClient = class {
9046
9046
  return null;
9047
9047
  }
9048
9048
  async request(method, params, opts) {
9049
- if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
9049
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
9050
9050
  const id = randomUUID();
9051
9051
  const frame = {
9052
9052
  type: "req",
@@ -9978,7 +9978,7 @@ async function routeReply(params) {
9978
9978
  const resolvedReplyToId = replyToId ?? (channelId === "slack" && threadId != null && threadId !== "" ? String(threadId) : void 0);
9979
9979
  const resolvedThreadId = channelId === "slack" ? null : threadId ?? null;
9980
9980
  try {
9981
- const { deliverOutboundPayloads } = await import("./deliver-BMg6XjUA.js").then((n) => n.n);
9981
+ const { deliverOutboundPayloads } = await import("./deliver-D0zCpBS2.js").then((n) => n.n);
9982
9982
  return {
9983
9983
  ok: true,
9984
9984
  messageId: (await deliverOutboundPayloads({
@@ -43242,7 +43242,7 @@ async function deliverSessionMaintenanceWarning(params) {
43242
43242
  return;
43243
43243
  }
43244
43244
  try {
43245
- const { deliverOutboundPayloads } = await import("./deliver-BMg6XjUA.js").then((n) => n.n);
43245
+ const { deliverOutboundPayloads } = await import("./deliver-D0zCpBS2.js").then((n) => n.n);
43246
43246
  await deliverOutboundPayloads({
43247
43247
  cfg: params.cfg,
43248
43248
  channel,
@@ -88,10 +88,10 @@ import "./npm-registry-spec-EUQu1qjD.js";
88
88
  import "./skill-scanner-Cvwk4mLV.js";
89
89
  import "./installs-Bn3xUHko.js";
90
90
  import "./channels-status-issues-CGx5YsbN.js";
91
- import "./register.subclis-Cb1ErrVQ.js";
92
- import "./command-registry-DmjX-MJb.js";
91
+ import "./register.subclis-BFq9K0q9.js";
92
+ import "./command-registry-DtivbkBg.js";
93
93
  import "./program-context-CTkBT0K5.js";
94
- import { r as installCompletion } from "./completion-cli-DezSeZQA.js";
94
+ import { r as installCompletion } from "./completion-cli-M9mpw_DS.js";
95
95
  import "./daemon-runtime-Bt9_ZcwQ.js";
96
96
  import { r as parseSemver } from "./runtime-guard-DaaVdMT6.js";
97
97
  import "./onboard-helpers-CilvN36L.js";
@@ -113,8 +113,8 @@ import { n as updateNpmInstalledPlugins, t as syncPluginsForUpdateChannel } from
113
113
  import "./doctor-config-flow-ClsCvpwI.js";
114
114
  import "./systemd-linger-CMctWXke.js";
115
115
  import "./health-format-t8t9hXjC.js";
116
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-BJ3NsTmX.js";
117
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-BCVASe0n.js";
116
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled--PI8fuuB.js";
117
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-DLx2ecZ2.js";
118
118
  import { spawn, spawnSync } from "node:child_process";
119
119
  import os from "node:os";
120
120
  import path from "node:path";
@@ -82,7 +82,7 @@ import "./replies-DSaEOCgv.js";
82
82
  import "./pi-tools.policy-Cm2mPWWM.js";
83
83
  import "./run-reply-turn-CrfZuxxN.js";
84
84
  import { r as parseSemver } from "./runtime-guard-Ci00bPHY.js";
85
- import "./program-context-DCb3cVEC.js";
85
+ import "./program-context-BHvgRRy_.js";
86
86
  import "./catalog-ByDe_tgJ.js";
87
87
  import "./skills-status-DW5xDDyW.js";
88
88
  import { n as inheritOptionFromParent } from "./command-options-BFvvecvU.js";
@@ -94,7 +94,7 @@ import "./npm-registry-spec-sOqVp2uO.js";
94
94
  import "./skill-scanner-Bb0TIl4W.js";
95
95
  import "./installs-BDkKnnYE.js";
96
96
  import "./channels-status-issues-CtII6GDY.js";
97
- import { r as installCompletion } from "./completion-cli-CKczmer5.js";
97
+ import { r as installCompletion } from "./completion-cli-DAtKJGz_.js";
98
98
  import "./daemon-runtime-bdvJvhh0.js";
99
99
  import "./onboard-helpers-ClA4h5_K.js";
100
100
  import "./systemd-C73gWrPp.js";
@@ -115,8 +115,8 @@ import { n as updateNpmInstalledPlugins, t as syncPluginsForUpdateChannel } from
115
115
  import "./doctor-config-flow-Brr2nZj7.js";
116
116
  import "./systemd-linger-FUCumCk_.js";
117
117
  import "./health-format-Cj8doEON.js";
118
- import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-ZdXAuRQQ.js";
119
- import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-AGw1egU_.js";
118
+ import { n as doctorCommand, t as selectStyled } from "./prompt-select-styled-DawD9uin.js";
119
+ import { r as ensureCompletionCacheExists, t as checkShellCompletionStatus } from "./doctor-completion-BlxU7_DJ.js";
120
120
  import os from "node:os";
121
121
  import path from "node:path";
122
122
  import fs from "node:fs/promises";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symerian/symi",
3
- "version": "3.1.0",
3
+ "version": "3.1.1",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/jaysteelmind/symi#readme",