@symerian/symi 2.2.6 → 2.2.8

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 (117) hide show
  1. package/dist/{agents-nuS2h5ue.js → agents-DbnUoR_W.js} +4 -4
  2. package/dist/{agents.config-3mkYv9BE.js → agents.config-D4WnZfkE.js} +1 -1
  3. package/dist/{agents.config-pj-OsrUT.js → agents.config-qyBeLoW5.js} +1 -1
  4. package/dist/{audio-preflight-CJ3sqM3d.js → audio-preflight-BsS_1f9-.js} +4 -4
  5. package/dist/{audio-preflight-BGSBr_SJ.js → audio-preflight-Cv9Z1hfd.js} +4 -4
  6. package/dist/{auth-choice-D3a-vonc.js → auth-choice-DYxn5otk.js} +1 -1
  7. package/dist/{auth-choice-BRJsVuNT.js → auth-choice-TbOBqNzh.js} +1 -1
  8. package/dist/{banner-Bb1_x1cQ.js → banner-BGxrGU83.js} +1 -1
  9. package/dist/build-info.json +3 -3
  10. package/dist/bundled/boot-md/handler.js +6 -6
  11. package/dist/bundled/session-memory/handler.js +6 -6
  12. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  13. package/dist/{channel-options-s4gZAPwl.js → channel-options-8st4ZPAV.js} +1 -1
  14. package/dist/{channel-options-CDZ4h6SP.js → channel-options-qDtKomWq.js} +1 -1
  15. package/dist/{channel-web-CKn3vwF-.js → channel-web-DQusem-l.js} +1 -1
  16. package/dist/{channels-cli-BsRDVuN-.js → channels-cli-BfrCgEUI.js} +4 -4
  17. package/dist/{channels-cli-C1ThSe3E.js → channels-cli-DZ9QSHcp.js} +4 -4
  18. package/dist/{chrome-BM8V9EPM.js → chrome-Bf5N4gMh.js} +7 -7
  19. package/dist/{chrome-Bs9dOXhy.js → chrome-CQNK4Of4.js} +7 -7
  20. package/dist/{cli-CdwLjjyv.js → cli-D484UoYM.js} +1 -1
  21. package/dist/{cli-CMonzisL.js → cli-isTrIFLa.js} +1 -1
  22. package/dist/{command-registry-TnD0Wo00.js → command-registry-D4kcHIMn.js} +9 -9
  23. package/dist/{completion-cli-pvycADdj.js → completion-cli-1m5OvbnB.js} +2 -2
  24. package/dist/{completion-cli-5kGhguIU.js → completion-cli-CtOpZu6z.js} +1 -1
  25. package/dist/{config-cli-DWCX4dyC.js → config-cli-BVbYrdKA.js} +1 -1
  26. package/dist/{config-cli-DxZEez4W.js → config-cli-BlpcRRjX.js} +1 -1
  27. package/dist/{configure-kEIiLFLp.js → configure-C-o6fkN4.js} +3 -3
  28. package/dist/{configure-B90B0uFn.js → configure-D4WT6m8B.js} +3 -3
  29. package/dist/control-ui/css/style.css +30 -0
  30. package/dist/control-ui/index.html +4 -0
  31. package/dist/control-ui/js/app.js +49 -0
  32. package/dist/control-ui/js/gateway.js +9 -0
  33. package/dist/control-ui/js/models.js +1 -1
  34. package/dist/{deliver-Dh5uiYS8.js → deliver-CBVqE05W.js} +1 -1
  35. package/dist/{deliver-Bs6SHLMp.js → deliver-CeOnWRNZ.js} +1 -1
  36. package/dist/{doctor-completion-Cye8oKIJ.js → doctor-completion-CU32z26S.js} +1 -1
  37. package/dist/{doctor-completion-BOwgNORd.js → doctor-completion-rtRPARP8.js} +1 -1
  38. package/dist/entry.js +1 -1
  39. package/dist/extensionAPI.js +6 -6
  40. package/dist/{gateway-cli-DRYkJB-y.js → gateway-cli-D9tJexeo.js} +22 -9
  41. package/dist/{gateway-cli-Ce2t7jof.js → gateway-cli-dxsgPoqI.js} +22 -9
  42. package/dist/{glass-ui-ws-CRdvmB5D.js → glass-ui-ws-BvSaDLuk.js} +11 -7
  43. package/dist/{glass-ui-ws--I0WsG7s.js → glass-ui-ws-BxliIaQO.js} +11 -7
  44. package/dist/{health-CJoGuAfg.js → health-6atzBDlL.js} +1 -1
  45. package/dist/{health-C1DLgFhT.js → health-BpVkd1NR.js} +1 -1
  46. package/dist/{hooks-cli-EtlTf6l_.js → hooks-cli-A0zhogYG.js} +2 -2
  47. package/dist/{hooks-cli-CrzS9jmd.js → hooks-cli-BdV4KLxW.js} +2 -2
  48. package/dist/{image-CkMDI3pp.js → image-CAUuNGNO.js} +1 -1
  49. package/dist/{image-CjO1LLbc.js → image-Crdjqg8r.js} +1 -1
  50. package/dist/index.js +6 -6
  51. package/dist/llm-slug-generator.js +6 -6
  52. package/dist/{models-DHCzr9eP.js → models-CBEZc-xT.js} +2 -2
  53. package/dist/{models-cli-C4ExoUXy.js → models-cli-BIM5pEpQ.js} +2 -2
  54. package/dist/{models-cli-C4ukQVHf.js → models-cli-DlUDMBlo.js} +3 -3
  55. package/dist/{onboard-QtMwCIU2.js → onboard-BXp3rpw1.js} +2 -2
  56. package/dist/{onboard-CAcATXB3.js → onboard-DXEF3bw2.js} +2 -2
  57. package/dist/{onboard-channels-Iy7uyjqi.js → onboard-channels-OKIylMMu.js} +1 -1
  58. package/dist/{onboard-channels-DDt5x3Xi.js → onboard-channels-qLCTzt3v.js} +1 -1
  59. package/dist/{onboarding-DtTOnF5l.js → onboarding-HJJedJ3u.js} +3 -3
  60. package/dist/{onboarding-CRU_W0dm.js → onboarding-m_e9LePg.js} +3 -3
  61. package/dist/{onboarding.finalize-DhDP0q8g.js → onboarding.finalize-CGVAc5-e.js} +6 -6
  62. package/dist/{onboarding.finalize-CKAIiDqs.js → onboarding.finalize-CbjQ-91D.js} +5 -5
  63. package/dist/{pi-embedded-BBROwjX_.js → pi-embedded-C4Cb6hc3.js} +16 -16
  64. package/dist/{pi-embedded-BkhyOzCD.js → pi-embedded-Cd7Gd0Am.js} +16 -16
  65. package/dist/{pi-embedded-helpers-D-cALDuy.js → pi-embedded-helpers-B86ZS0eB.js} +4 -4
  66. package/dist/{pi-embedded-helpers-D3O-Jz_G.js → pi-embedded-helpers-xjO9noTy.js} +4 -4
  67. package/dist/{plugin-registry-ckK1Eqxg.js → plugin-registry-D0iAVBbj.js} +1 -1
  68. package/dist/{plugin-registry-CKzb-3wd.js → plugin-registry-DOEhQFQJ.js} +1 -1
  69. package/dist/{plugins-cli-B1wheurP.js → plugins-cli-6nKHKPj8.js} +2 -2
  70. package/dist/{plugins-cli-4_vsyXjl.js → plugins-cli-DU06_0f6.js} +2 -2
  71. package/dist/{program-TcQJDsX0.js → program-D1icw1T9.js} +7 -7
  72. package/dist/{program-context-Dg2Np8Zw.js → program-context-Bqybavvo.js} +17 -17
  73. package/dist/{prompt-select-styled-DAdS06gH.js → prompt-select-styled-Cj3jTVJJ.js} +4 -4
  74. package/dist/{prompt-select-styled-CQjbqwvN.js → prompt-select-styled-DptZ40df.js} +4 -4
  75. package/dist/{provider-auth-helpers-DzN6dX9q.js → provider-auth-helpers-BVSJctmE.js} +1 -1
  76. package/dist/{provider-auth-helpers-DB8QYTYh.js → provider-auth-helpers-CDnMFdFw.js} +1 -1
  77. package/dist/{push-apns-CHAQFZbY.js → push-apns-CpUJIlI7.js} +1 -1
  78. package/dist/{push-apns-ClGMwC80.js → push-apns-DtKC_-eP.js} +1 -1
  79. package/dist/{pw-ai-Bea6vnxP.js → pw-ai-BcniFyZm.js} +1 -1
  80. package/dist/{pw-ai-U9oqOgyv.js → pw-ai-C2hGnRfL.js} +1 -1
  81. package/dist/{register.agent-BQCR4CBb.js → register.agent-DesQbi0N.js} +5 -5
  82. package/dist/{register.agent-B7N-v5Mg.js → register.agent-DszKb7kT.js} +6 -6
  83. package/dist/{register.configure-tbavr38Q.js → register.configure-CPZ2pkCL.js} +6 -6
  84. package/dist/{register.configure-CL9nlXc3.js → register.configure-CiHbtNBW.js} +6 -6
  85. package/dist/{register.maintenance-JPUE9NXl.js → register.maintenance-BBjwt-34.js} +7 -7
  86. package/dist/{register.maintenance-D4e74TuY.js → register.maintenance-hUQ3a2-X.js} +8 -8
  87. package/dist/{register.message-D0Cq2x8X.js → register.message-BJG43ey1.js} +2 -2
  88. package/dist/{register.message-BmGLezc2.js → register.message-BZ_faykn.js} +2 -2
  89. package/dist/{register.onboard-DDIJBTxd.js → register.onboard-BuvppItf.js} +4 -4
  90. package/dist/{register.onboard-ChTlfU6k.js → register.onboard-CtDGWgek.js} +4 -4
  91. package/dist/{register.setup-p9eaK45O.js → register.setup-09FZm-3U.js} +4 -4
  92. package/dist/{register.setup-DDo_Kvoq.js → register.setup-CK_rXwht.js} +4 -4
  93. package/dist/{register.status-health-sessions-DHI7I-An.js → register.status-health-sessions-CYBXZfzw.js} +3 -3
  94. package/dist/{register.status-health-sessions-DT6gAamm.js → register.status-health-sessions-Dq1GhVZd.js} +3 -3
  95. package/dist/{register.subclis-DF2GPUXO.js → register.subclis-oaqsIg7c.js} +9 -9
  96. package/dist/{reply-BGBRWu_r.js → reply-BnAPNcvn.js} +3 -3
  97. package/dist/{run-main-6Y8oxwjc.js → run-main-g9-g4T_a.js} +14 -14
  98. package/dist/{runner-kv4GI5eX.js → runner-DFFbD4Jj.js} +1 -1
  99. package/dist/{runner-DDAa40wm.js → runner-M7hSmkG1.js} +1 -1
  100. package/dist/{server-methods-Br0D7ovX.js → server-methods-1TVNg0k5.js} +7 -7
  101. package/dist/{server-methods-D_xNgVRl.js → server-methods-CYVVBHwG.js} +7 -7
  102. package/dist/{server-node-events-UAr71uwc.js → server-node-events-CPTRFOMY.js} +2 -2
  103. package/dist/{server-node-events-CYqlT8In.js → server-node-events-Cvqw-9rw.js} +2 -2
  104. package/dist/{status-B0E2EIVt.js → status-B7VIwi53.js} +2 -2
  105. package/dist/{status-DT80WcHk.js → status-BS3y9HjF.js} +1 -1
  106. package/dist/{status-BGds6W9t.js → status-CCrlpUEA.js} +2 -2
  107. package/dist/{status-e8uWmyEb.js → status-CDpLvmFd.js} +1 -1
  108. package/dist/{subagent-registry-Bdq971iu.js → subagent-registry-BSgPGZxs.js} +3 -3
  109. package/dist/{update-cli-Ck2MutZk.js → update-cli-C8sM6pAA.js} +8 -8
  110. package/dist/{update-cli-DNIl7PnC.js → update-cli-DL3Tb3b0.js} +7 -7
  111. package/dist/{update-runner-FuqSMzV5.js → update-runner-ChoWv-od.js} +1 -1
  112. package/dist/{update-runner-D6WDlrp3.js → update-runner-Dm7EwGFW.js} +1 -1
  113. package/dist/{web-Ck_rAgaX.js → web-0w8t_r2B.js} +6 -6
  114. package/dist/{web-CwQfVHEO.js → web-UEqiaso9.js} +6 -6
  115. package/dist/{web-BZOpNSzC.js → web-VbydcdAk.js} +1 -1
  116. package/dist/{web-HLh16mL2.js → web-sQrQA6or.js} +2 -2
  117. package/package.json +1 -1
@@ -11,14 +11,14 @@ import { n as stylePromptMessage, r as stylePromptTitle, t as stylePromptHint }
11
11
  import { t as note$1 } from "./note-DDecZomM.js";
12
12
  import { t as WizardCancelledError } from "./prompts-m1IJwIAx.js";
13
13
  import { t as createClackPrompter } from "./clack-prompter-B1aVoXd5.js";
14
- import { r as setupChannels, t as noteChannelStatus } from "./onboard-channels-Iy7uyjqi.js";
14
+ import { r as setupChannels, t as noteChannelStatus } from "./onboard-channels-OKIylMMu.js";
15
15
  import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-Co0_hiZm.js";
16
16
  import { t as resolveGatewayService } from "./service-Cm9j9WzQ.js";
17
- import { r as healthCommand } from "./health-C1DLgFhT.js";
17
+ import { r as healthCommand } from "./health-BpVkd1NR.js";
18
18
  import { t as ensureControlUiAssetsBuilt } from "./control-ui-assets-BseSWee1.js";
19
19
  import { n as logConfigUpdated } from "./logging-BGewRZy0.js";
20
20
  import { n as promptAuthChoiceGrouped } from "./auth-choice-prompt-DVcYPG2v.js";
21
- import { i as applyAuthChoice, n as resolvePreferredProviderForAuthChoice } from "./auth-choice-BRJsVuNT.js";
21
+ import { i as applyAuthChoice, n as resolvePreferredProviderForAuthChoice } from "./auth-choice-TbOBqNzh.js";
22
22
  import { a as promptDefaultModel, n as applyModelFallbacksFromSelection, o as promptModelAllowlist, r as applyPrimaryModel, t as applyModelAllowlist } from "./model-picker-Cv_lMtfR.js";
23
23
  import { t as ensureSystemdUserLingerInteractive } from "./systemd-linger-DA_LW52P.js";
24
24
  import { a as promptCustomApiConfig } from "./onboard-custom-Bcifi3N2.js";
@@ -542,6 +542,36 @@ html, body {
542
542
  letter-spacing: 0.04em;
543
543
  }
544
544
 
545
+ /* ── Secondary "Working" indicator ── */
546
+ .aso-working {
547
+ display: none;
548
+ align-items: center;
549
+ justify-content: center;
550
+ gap: 6px;
551
+ margin-top: 8px;
552
+ opacity: 0;
553
+ transition: opacity 0.3s ease;
554
+ }
555
+ .aso-working.active {
556
+ display: flex;
557
+ opacity: 1;
558
+ }
559
+ .aso-working-asterisk {
560
+ display: inline-block;
561
+ font-size: 12px;
562
+ color: var(--aso-color, rgba(0,212,255,0.75));
563
+ animation: aso-spin 1.5s linear infinite;
564
+ filter: drop-shadow(0 0 4px var(--aso-color, rgba(0,212,255,0.75)));
565
+ }
566
+ .aso-working-text {
567
+ font-family: var(--font-mono);
568
+ font-size: 9px;
569
+ font-weight: 600;
570
+ letter-spacing: 0.18em;
571
+ text-transform: uppercase;
572
+ color: var(--text-dim);
573
+ }
574
+
545
575
  /* ── Layout columns ───────────────────────────────────────────────── */
546
576
  .metrics-col {
547
577
  position: fixed;
@@ -62,6 +62,10 @@
62
62
  </div>
63
63
  <div class="aso-label" id="aso-label">STANDBY</div>
64
64
  <div class="aso-sub" id="aso-sub">Awaiting your prompt</div>
65
+ <div class="aso-working" id="aso-working">
66
+ <span class="aso-working-asterisk">✳</span>
67
+ <span class="aso-working-text">Working</span>
68
+ </div>
65
69
  </div>
66
70
 
67
71
  <!-- Subagents Panel -->
@@ -7,6 +7,8 @@ const newSessionBtn = document.getElementById("new-session-btn");
7
7
  const stopBtn = document.getElementById("stop-btn");
8
8
 
9
9
  let isStreaming = false;
10
+ let workingActive = false;
11
+ let activeSubagentCount = 0;
10
12
  let currentRunId = null;
11
13
  let streamBubble = null;
12
14
  let streamContent = null;
@@ -241,6 +243,7 @@ function handleRunFailure(reason) {
241
243
 
242
244
  // Show ERROR state on orb, then reset input
243
245
  setAgentStatus("error");
246
+ hideWorkingIndicator();
244
247
  isStreaming = false;
245
248
  currentRunId = null;
246
249
  stopBtn.style.opacity = "";
@@ -491,12 +494,28 @@ async function loadMoreHistory() {
491
494
  let thinkingEl = null;
492
495
 
493
496
  function handleGatewayEvent(event) {
497
+ // Handle sub-agent lifecycle events (independent of isStreaming)
498
+ if (event.event === "subagent") {
499
+ const s = event.payload;
500
+ if (s && s.phase === "started") {
501
+ activeSubagentCount++;
502
+ showWorkingIndicator();
503
+ } else if (s && s.phase === "completed") {
504
+ activeSubagentCount = Math.max(0, activeSubagentCount - 1);
505
+ if (activeSubagentCount === 0 && !isStreaming) {
506
+ hideWorkingIndicator();
507
+ }
508
+ }
509
+ return;
510
+ }
511
+
494
512
  // Handle agent lifecycle/tool events — these prove the agent is alive
495
513
  if (event.event === "agent" && isStreaming) {
496
514
  const a = event.payload;
497
515
  if (a) {
498
516
  // Any agent event resets the watchdog — the agent is working
499
517
  armWatchdog();
518
+ showWorkingIndicator();
500
519
 
501
520
  // Update the sub-label with what the agent is actually doing
502
521
  if (a.stream === "tool" && a.data) {
@@ -607,6 +626,13 @@ function handleGatewayEvent(event) {
607
626
  }
608
627
  closeStreamBubble(window.activeModelId || "unknown model");
609
628
  setAgentStatus("done");
629
+ // Sync sub-agent count from server and conditionally hide working indicator
630
+ if (typeof p.activeSubagentCount === "number") {
631
+ activeSubagentCount = p.activeSubagentCount;
632
+ }
633
+ if (activeSubagentCount <= 0) {
634
+ hideWorkingIndicator();
635
+ }
610
636
  isStreaming = false;
611
637
  currentRunId = null;
612
638
  stopBtn.style.opacity = ""; // reset stop button visual state
@@ -632,6 +658,7 @@ function handleGatewayEvent(event) {
632
658
  thinkingEl = null;
633
659
  }
634
660
  setAgentStatus("idle");
661
+ hideWorkingIndicator();
635
662
  isStreaming = false;
636
663
  currentRunId = null;
637
664
  stopBtn.style.opacity = ""; // reset stop button visual state
@@ -652,6 +679,7 @@ function handleGatewayEvent(event) {
652
679
  const asoPanel = document.getElementById("agent-status-panel");
653
680
  const asoLabel = document.getElementById("aso-label");
654
681
  const asoSub = document.getElementById("aso-sub");
682
+ const asoWorking = document.getElementById("aso-working");
655
683
  let asoDoneTimer = null;
656
684
 
657
685
  const ASO_STATES = {
@@ -714,6 +742,24 @@ function setAgentStatus(key) {
714
742
  }
715
743
  }
716
744
 
745
+ // ── Working indicator helpers ─────────────────────────────────────
746
+ function showWorkingIndicator() {
747
+ if (!workingActive) {
748
+ workingActive = true;
749
+ if (asoWorking) {
750
+ asoWorking.classList.add("active");
751
+ }
752
+ }
753
+ }
754
+ function hideWorkingIndicator() {
755
+ if (workingActive) {
756
+ workingActive = false;
757
+ if (asoWorking) {
758
+ asoWorking.classList.remove("active");
759
+ }
760
+ }
761
+ }
762
+
717
763
  // ── Input state ────────────────────────────────────────────────────
718
764
  function disableInput() {
719
765
  // Keep textarea enabled so user can type their next queued message while AI responds
@@ -789,6 +835,7 @@ async function sendText(text) {
789
835
  return;
790
836
  }
791
837
  isStreaming = true;
838
+ showWorkingIndicator();
792
839
  disableInput();
793
840
  updateQueueBtn();
794
841
 
@@ -877,6 +924,8 @@ async function handleNewSession() {
877
924
  responseArea.appendChild(cleared);
878
925
 
879
926
  setAgentStatus("idle");
927
+ activeSubagentCount = 0;
928
+ hideWorkingIndicator();
880
929
  clearQueue(); // discard any queued prompts — new session = clean slate
881
930
 
882
931
  // Show archive toast — lets user jump directly to history if they regret it
@@ -147,6 +147,15 @@ class SymiGateway extends EventTarget {
147
147
  return;
148
148
  }
149
149
 
150
+ if (type === "subagent") {
151
+ this.dispatchEvent(
152
+ new CustomEvent("event", {
153
+ detail: { event: "subagent", payload: msg.payload },
154
+ }),
155
+ );
156
+ return;
157
+ }
158
+
150
159
  if (type === "rpc.response") {
151
160
  const pending = this._pending.get(msg.id);
152
161
  if (pending) {
@@ -4,7 +4,7 @@
4
4
  (function () {
5
5
  const MODELS = {
6
6
  local: "ollama/gemma4:31b-128k",
7
- redsand: "redsand/nemotron-3-super-120b",
7
+ redsand: "redsand/gemma-4-31b",
8
8
  api: "anthropic/claude-sonnet-4-6",
9
9
  };
10
10
 
@@ -5,7 +5,7 @@ import { c as getActivePluginRegistry, v as createInternalHookEvent, y as trigge
5
5
  import { t as createSubsystemLogger } from "./subsystem-CZixfwU8.js";
6
6
  import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-Cn6drXx2.js";
7
7
  import { r as normalizeChannelId, t as getChannelPlugin } from "./plugins-71oIavrF.js";
8
- import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-D3O-Jz_G.js";
8
+ import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-xjO9noTy.js";
9
9
  import { d as getChannelDock } from "./thinking-W85Rb32m.js";
10
10
  import { c as resolveChunkMode, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, n as chunkByParagraph } from "./chunk-DTMTDXwE.js";
11
11
  import { n as resolveMarkdownTableMode } from "./markdown-tables-DawaaZEe.js";
@@ -5,7 +5,7 @@ import { c as getActivePluginRegistry, v as createInternalHookEvent, x as trigge
5
5
  import { t as createSubsystemLogger } from "./subsystem-Bs9YvKLa.js";
6
6
  import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-H1H1LiSQ.js";
7
7
  import { r as normalizeChannelId, t as getChannelPlugin } from "./plugins-DQYI3Fr-.js";
8
- import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-D-cALDuy.js";
8
+ import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-B86ZS0eB.js";
9
9
  import { d as getChannelDock } from "./thinking-CdlENGRW.js";
10
10
  import { c as resolveChunkMode, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, n as chunkByParagraph } from "./chunk-BW5f05BR.js";
11
11
  import { n as resolveMarkdownTableMode } from "./markdown-tables-iMQQZu4Q.js";
@@ -1,7 +1,7 @@
1
1
  import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
2
2
  import { r as resolveCliName } from "./command-format-COaS-S7B.js";
3
3
  import { t as note } from "./note-DeHoW7xO.js";
4
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-5kGhguIU.js";
4
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-CtOpZu6z.js";
5
5
  import path from "node:path";
6
6
  import { spawnSync } from "node:child_process";
7
7
 
@@ -1,7 +1,7 @@
1
1
  import { r as resolveCliName } from "./command-format-BtYOfWxC.js";
2
2
  import { t as resolveSymiPackageRoot } from "./symi-root-BNuQ4lAT.js";
3
3
  import { t as note } from "./note-DDecZomM.js";
4
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-pvycADdj.js";
4
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-1m5OvbnB.js";
5
5
  import { spawnSync } from "node:child_process";
6
6
  import path from "node:path";
7
7
 
package/dist/entry.js CHANGED
@@ -2500,7 +2500,7 @@ if (!ensureExperimentalWarningSuppressed()) {
2500
2500
  applyCliProfileEnv({ profile: parsed.profile });
2501
2501
  process$1.argv = parsed.argv;
2502
2502
  }
2503
- import("./run-main-6Y8oxwjc.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
2503
+ import("./run-main-g9-g4T_a.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
2504
2504
  console.error("[symi] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
2505
2505
  process$1.exitCode = 1;
2506
2506
  });
@@ -7,13 +7,13 @@ import { a as resolveAgentIdentity } from "./reply-prefix-K_J_nfgx.js";
7
7
  import "./github-copilot-token-BbsJ0Qbo.js";
8
8
  import "./env-CQ_DQOwT.js";
9
9
  import "./tokens-Cn6drXx2.js";
10
- import { D as resolveAgentTimeoutMs, t as runEmbeddedPiAgent } from "./pi-embedded-BkhyOzCD.js";
10
+ import { D as resolveAgentTimeoutMs, t as runEmbeddedPiAgent } from "./pi-embedded-Cd7Gd0Am.js";
11
11
  import "./plugins-71oIavrF.js";
12
12
  import "./accounts-DDEyGwby.js";
13
13
  import "./bindings-DYVakimr.js";
14
14
  import "./send-DoiQ-lVY.js";
15
15
  import "./send-C1DE47RQ.js";
16
- import "./deliver-Dh5uiYS8.js";
16
+ import "./deliver-CBVqE05W.js";
17
17
  import "./diagnostic-D0xmLpej.js";
18
18
  import "./diagnostic-session-state-C1vRJs5w.js";
19
19
  import "./accounts-8zZqL37v.js";
@@ -21,10 +21,10 @@ import "./send-CdxBNofn.js";
21
21
  import "./image-ops-ByaQt43P.js";
22
22
  import "./pi-model-discovery-j5tVLINv.js";
23
23
  import "./message-channel-BQINJQIT.js";
24
- import { G as saveSessionStore, H as loadSessionStore } from "./pi-embedded-helpers-D3O-Jz_G.js";
24
+ import { G as saveSessionStore, H as loadSessionStore } from "./pi-embedded-helpers-xjO9noTy.js";
25
25
  import "./config-Btm9gODl.js";
26
26
  import "./manifest-registry-D-mTF1cj.js";
27
- import "./chrome-BM8V9EPM.js";
27
+ import "./chrome-Bf5N4gMh.js";
28
28
  import "./skills-BNpGMnp-.js";
29
29
  import "./redact-1NGYV_8p.js";
30
30
  import "./errors-CPfngF0S.js";
@@ -34,7 +34,7 @@ import "./thinking-W85Rb32m.js";
34
34
  import "./accounts-DImOt9jX.js";
35
35
  import { n as resolveSessionFilePath, s as resolveStorePath } from "./paths-DkMamAQ-.js";
36
36
  import "./tool-images-ChC2CXaN.js";
37
- import "./image-CjO1LLbc.js";
37
+ import "./image-Crdjqg8r.js";
38
38
  import "./manager-jpn5vRTY.js";
39
39
  import "./gemini-auth-CSlZZ1Pw.js";
40
40
  import "./sqlite-BNh23mUR.js";
@@ -47,7 +47,7 @@ import "./ir-F0moAwIl.js";
47
47
  import "./render-B1VqYyvo.js";
48
48
  import "./commands-registry-C_aYUwpl.js";
49
49
  import "./skill-commands-DklY7Cj7.js";
50
- import "./runner-kv4GI5eX.js";
50
+ import "./runner-DFFbD4Jj.js";
51
51
  import "./fetch-DtLn7YU3.js";
52
52
  import "./channel-activity-D9q-fIPB.js";
53
53
  import "./tables-COnZ169v.js";
@@ -1,7 +1,7 @@
1
1
  import { _ as expandHomePrefix, g as resolveStateDir, i as isNixMode, l as resolveGatewayLockDir, o as resolveConfigPath, r as STATE_DIR, t as CONFIG_PATH, u as resolveGatewayPort } from "./paths-Cqn-zk3M.js";
2
2
  import { B as theme, E as truncateUtf16Safe, H as getLogger, P as setVerbose, R as colorize, S as shortenHomePath, U as getResolvedLoggerSettings, V as getChildLogger, c as ensureDir, t as CONFIG_DIR, y as resolveUserPath, z as isRich } from "./utils-B-0b9bGM.js";
3
3
  import { d as supportsXHighThinking, l as normalizeVerboseLevel, s as normalizeThinkLevel } from "./thinking-EAliFiVK.js";
4
- import { $ as normalizeOptionalText, $n as getActiveTaskCount, $t as buildSafeExternalPrompt, A as resetDirectoryCache, Ar as resolveInputFileLimits, At as agentCommand, B as consumeRestartSentinel, Cr as DEFAULT_INPUT_IMAGE_MAX_BYTES, Dn as countActiveDescendantRuns, Dr as extractFileContentFromSource, Dt as requestBodyErrorToText, Er as DEFAULT_INPUT_TIMEOUT_MS, Et as readJsonBodyWithLimit, F as isGatewaySigusr1RestartExternallyAllowed, Fn as emitAgentEvent, Gt as setCliSessionId, H as formatRestartSentinelMessage, I as markGatewaySigusr1RestartHandled, In as getAgentRunContext, It as resolveOutboundTarget, Kt as runCliAgent, Ln as onAgentEvent, Lt as resolveSessionDeliveryTarget, M as consumeGatewaySigusr1RestartAuthorization, Mn as runSubagentAnnounceFlow, Mr as resolveAgentTimeoutMs, N as deferGatewayRestartUntilIdle, Nn as readLatestAssistantReply, O as resolveOutboundSessionRoute, On as initSubagentRegistry, Or as extractImageContentFromSource, Ot as computeBackoff, P as emitGatewayRestart, Pn as clearAgentRunContext, Q as normalizeOptionalSessionKey, R as setGatewaySigusr1RestartPolicy, Rn as registerAgentRunContext, Rt as createOutboundSendDeps, S as loadSessionEntry, Tr as DEFAULT_INPUT_MAX_REDIRECTS, Tt as handleSlackHttpRequest, Ut as runWithModelFallback, Vt as createDefaultDeps, W as summarizeRestartSentinel, Wt as getCliSessionId, X as inferLegacyName, Yt as resolveAgentAvatar, Z as normalizeOptionalAgentId, ar as CommandLane, at as stripLegacyDeliveryFields, d as getActiveEmbeddedRunCount, dr as lookupContextTokens, dt as requestHeartbeatNow, en as detectSuspiciousPatterns, et as normalizePayloadToSystemText, g as resolveAnnounceTargetFromKey, gt as loadSymiPlugins, h as createSymiTools, i as resolveCronStyleNow, ir as waitForActiveTasks, it as hasLegacyDeliveryHints, kn as listDescendantRunsForRequester, kr as normalizeMimeList, kt as sleepWithAbort, l as runEmbeddedPiAgent, m as buildDefaultToolPolicyPipelineSteps, mn as getTotalPendingReplies, mt as getPluginToolMeta, nn as isExternalHookSession, nr as resetAllLanes, nt as migrateLegacyCronPayload, or as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, p as applyToolPolicyPipeline, q as normalizeHttpWebhookUrl, rr as setCommandLaneConcurrency, rt as buildDeliveryFromLegacyPayload, sn as buildHistoryContextFromEntries, tn as getHookType, tr as getTotalQueueSize, tt as normalizeRequiredName, ur as stripHeartbeatToken, wr as DEFAULT_INPUT_IMAGE_MIMES, yr as enqueueSystemEvent, z as setPreRestartDeferralCheck } from "./reply-BGBRWu_r.js";
4
+ import { $ as normalizeOptionalText, $t as buildSafeExternalPrompt, A as resetDirectoryCache, An as listDescendantRunsForRequester, Ar as normalizeMimeList, At as agentCommand, B as consumeRestartSentinel, Dn as countActiveDescendantRuns, Dr as DEFAULT_INPUT_TIMEOUT_MS, Dt as requestBodyErrorToText, Er as DEFAULT_INPUT_MAX_REDIRECTS, Et as readJsonBodyWithLimit, F as isGatewaySigusr1RestartExternallyAllowed, Fn as clearAgentRunContext, Gt as setCliSessionId, H as formatRestartSentinelMessage, I as markGatewaySigusr1RestartHandled, In as emitAgentEvent, It as resolveOutboundTarget, Kt as runCliAgent, Ln as getAgentRunContext, Lt as resolveSessionDeliveryTarget, M as consumeGatewaySigusr1RestartAuthorization, N as deferGatewayRestartUntilIdle, Nn as runSubagentAnnounceFlow, Nr as resolveAgentTimeoutMs, O as resolveOutboundSessionRoute, On as countActiveRunsForSession, Or as extractFileContentFromSource, Ot as computeBackoff, P as emitGatewayRestart, Pn as readLatestAssistantReply, Q as normalizeOptionalSessionKey, R as setGatewaySigusr1RestartPolicy, Rn as onAgentEvent, Rt as createOutboundSendDeps, S as loadSessionEntry, Tr as DEFAULT_INPUT_IMAGE_MIMES, Tt as handleSlackHttpRequest, Ut as runWithModelFallback, Vt as createDefaultDeps, W as summarizeRestartSentinel, Wt as getCliSessionId, X as inferLegacyName, Yt as resolveAgentAvatar, Z as normalizeOptionalAgentId, ar as waitForActiveTasks, at as stripLegacyDeliveryFields, br as enqueueSystemEvent, d as getActiveEmbeddedRunCount, dr as stripHeartbeatToken, dt as requestHeartbeatNow, en as detectSuspiciousPatterns, er as getActiveTaskCount, et as normalizePayloadToSystemText, fr as lookupContextTokens, g as resolveAnnounceTargetFromKey, gt as loadSymiPlugins, h as createSymiTools, i as resolveCronStyleNow, ir as setCommandLaneConcurrency, it as hasLegacyDeliveryHints, jr as resolveInputFileLimits, kn as initSubagentRegistry, kr as extractImageContentFromSource, kt as sleepWithAbort, l as runEmbeddedPiAgent, m as buildDefaultToolPolicyPipelineSteps, mn as getTotalPendingReplies, mt as getPluginToolMeta, nn as isExternalHookSession, nr as getTotalQueueSize, nt as migrateLegacyCronPayload, or as CommandLane, p as applyToolPolicyPipeline, q as normalizeHttpWebhookUrl, rr as resetAllLanes, rt as buildDeliveryFromLegacyPayload, sn as buildHistoryContextFromEntries, sr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, tn as getHookType, tt as normalizeRequiredName, wr as DEFAULT_INPUT_IMAGE_MAX_BYTES, z as setPreRestartDeferralCheck, zn as registerAgentRunContext } from "./reply-BnAPNcvn.js";
5
5
  import { S as parseAgentSessionKey, c as normalizeMainKey, f as toAgentRequestSessionKey, l as resolveAgentIdFromSessionKey, m as DEFAULT_ACCOUNT_ID, p as toAgentStoreSessionKey, r as buildAgentMainSessionKey, s as normalizeAgentId, t as DEFAULT_AGENT_ID, x as isSubagentSessionKey, y as isCronRunSessionKey } from "./session-key-DCt45XZa.js";
6
6
  import { r as matchesSkillFilter, t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
7
7
  import { C as createInternalHookEvent, S as clearInternalHooks, T as triggerInternalHook, m as createEmptyPluginRegistry, r as DEFAULT_CHAT_CHANNEL, w as registerInternalHook } from "./registry-Cja8eT7G.js";
@@ -135,20 +135,20 @@ import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } fr
135
135
  import { i as toOptionString, n as extractGatewayMiskeys, r as maybeExplainGatewayServiceStop, t as describeUnknownError } from "./shared-BJvwnR5z.js";
136
136
  import { c as probeGateway, s as resolveNodeCommandAllowlist } from "./audit-CbxXbquQ.js";
137
137
  import { t as discoverGatewayBeacons } from "./bonjour-discovery-BHTF5p0X.js";
138
- import { r as pickGatewaySelfPresence } from "./status-BGds6W9t.js";
139
- import { c as startHeartbeatRunner, i as styleHealthChannelLine, n as getHealthSnapshot, o as runHeartbeatOnce, t as formatHealthChannelLines } from "./health-CJoGuAfg.js";
138
+ import { r as pickGatewaySelfPresence } from "./status-CCrlpUEA.js";
139
+ import { c as startHeartbeatRunner, i as styleHealthChannelLine, n as getHealthSnapshot, o as runHeartbeatOnce, t as formatHealthChannelLines } from "./health-6atzBDlL.js";
140
140
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-Z947tKLt.js";
141
141
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, m as normalizeUpdateChannel, n as compareSemverStrings, t as checkUpdateStatus } from "./update-check-CtckACbb.js";
142
- import { t as runOnboardingWizard } from "./onboarding-CRU_W0dm.js";
143
- import { _ as getHandshakeTimeoutMs, a as DEFAULT_ASSISTANT_IDENTITY, b as resolveCronRunLogPath, c as upsertPresence, d as DEDUPE_MAX, f as DEDUPE_TTL_MS, g as TICK_INTERVAL_MS, h as MAX_PAYLOAD_BYTES, i as safeParseJson, l as formatError, m as MAX_BUFFERED_BYTES, n as handleGatewayRequest, o as resolveAssistantIdentity, p as HEALTH_REFRESH_INTERVAL_MS, r as broadcastPresenceSnapshot, s as listSystemPresence, t as coreGatewayHandlers, u as loadVoiceWakeConfig, v as abortChatRunById, x as startGatewayConfigReloader, y as appendCronRunLog } from "./server-methods-D_xNgVRl.js";
144
- import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-CHAQFZbY.js";
142
+ import { t as runOnboardingWizard } from "./onboarding-m_e9LePg.js";
143
+ import { _ as getHandshakeTimeoutMs, a as DEFAULT_ASSISTANT_IDENTITY, b as resolveCronRunLogPath, c as upsertPresence, d as DEDUPE_MAX, f as DEDUPE_TTL_MS, g as TICK_INTERVAL_MS, h as MAX_PAYLOAD_BYTES, i as safeParseJson, l as formatError, m as MAX_BUFFERED_BYTES, n as handleGatewayRequest, o as resolveAssistantIdentity, p as HEALTH_REFRESH_INTERVAL_MS, r as broadcastPresenceSnapshot, s as listSystemPresence, t as coreGatewayHandlers, u as loadVoiceWakeConfig, v as abortChatRunById, x as startGatewayConfigReloader, y as appendCronRunLog } from "./server-methods-CYVVBHwG.js";
144
+ import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-CpUJIlI7.js";
145
145
  import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-Bv0M7ka7.js";
146
- import "./agents.config-pj-OsrUT.js";
146
+ import "./agents.config-qyBeLoW5.js";
147
147
  import "./dm-policy-shared-Bh3TbexU.js";
148
148
  import "./node-service-Cxz4e-Qd.js";
149
149
  import "./status.update-Cu6R3wwz.js";
150
150
  import "./skills-install-D67isO1L.js";
151
- import "./update-runner-D6WDlrp3.js";
151
+ import "./update-runner-Dm7EwGFW.js";
152
152
  import { t as resolveAgentSessionDirs } from "./session-dirs-DWgIYmAt.js";
153
153
  import { i as shouldIncludeHook, r as resolveHookConfig, t as loadWorkspaceHookEntries } from "./workspace-CYxdoAlY.js";
154
154
  import { fileURLToPath, pathToFileURL } from "node:url";
@@ -2055,6 +2055,7 @@ function createAgentEventHandler({ broadcast, broadcastToConnIds, nodeSendToSess
2055
2055
  sessionKey,
2056
2056
  seq,
2057
2057
  state: "final",
2058
+ activeSubagentCount: countActiveRunsForSession(sessionKey),
2058
2059
  ...heartbeatCtx?.isHeartbeat ? { isHeartbeat: true } : {},
2059
2060
  message: text && !shouldSuppressSilent ? {
2060
2061
  role: "assistant",
@@ -2140,6 +2141,18 @@ function createAgentEventHandler({ broadcast, broadcastToConnIds, nodeSendToSess
2140
2141
  if (recipients && recipients.size > 0) broadcastToConnIds("agent", toolPayload, recipients);
2141
2142
  } else broadcast("agent", agentPayload);
2142
2143
  const lifecyclePhase = evt.stream === "lifecycle" && typeof evt.data?.phase === "string" ? evt.data.phase : null;
2144
+ if (lifecyclePhase && sessionKey && sessionKey.includes(":subagent:")) {
2145
+ if (lifecyclePhase === "start") broadcast("subagent", {
2146
+ phase: "started",
2147
+ sessionKey,
2148
+ runId: clientRunId
2149
+ });
2150
+ else if (lifecyclePhase === "end" || lifecyclePhase === "error") broadcast("subagent", {
2151
+ phase: "completed",
2152
+ sessionKey,
2153
+ runId: clientRunId
2154
+ });
2155
+ }
2143
2156
  if (sessionKey) {
2144
2157
  if (!isToolEvent || toolVerbose !== "off") nodeSendToSession(sessionKey, "agent", isToolEvent ? toolPayload : agentPayload);
2145
2158
  if (!isAborted && evt.stream === "assistant" && typeof evt.data?.text === "string") emitChatDelta(sessionKey, clientRunId, evt.runId, evt.seq, evt.data.text);
@@ -11637,7 +11650,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
11637
11650
  });
11638
11651
  let glassUiBridgeCleanup = null;
11639
11652
  if (!minimalTestGateway) {
11640
- const { createGlassUiBridge } = await import("./glass-ui-ws--I0WsG7s.js");
11653
+ const { createGlassUiBridge } = await import("./glass-ui-ws-BxliIaQO.js");
11641
11654
  glassUiBridgeCleanup = createGlassUiBridge({
11642
11655
  wss: glassUiWss,
11643
11656
  context: gatewayRequestContext,
@@ -21,7 +21,7 @@ import "./pairing-token-Byh6drgn.js";
21
21
  import { t as safeEqualSecret } from "./secret-equal-CbntzRkh.js";
22
22
  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";
23
23
  import { n as pickPrimaryTailnetIPv4, r as pickPrimaryTailnetIPv6 } from "./tailnet-Cmumpn76.js";
24
- import { $ as runCliAgent, An as extractImageContentFromSource, At as normalizePayloadToSystemText, Bt as getHookType, C as sleepWithAbort, Ct as normalizeHttpWebhookUrl, Dn as DEFAULT_INPUT_MAX_REDIRECTS, Dt as normalizeOptionalAgentId, En as DEFAULT_INPUT_IMAGE_MIMES, Et as inferLegacyName, Ft as stripLegacyDeliveryFields, G as getTotalPendingReplies, Gt as deferGatewayRestartUntilIdle, Jt as markGatewaySigusr1RestartHandled, Kt as emitGatewayRestart, Mn as resolveInputFileLimits, Mt as migrateLegacyCronPayload, Nt as buildDeliveryFromLegacyPayload, O as createOutboundSendDeps, On as DEFAULT_INPUT_TIMEOUT_MS, Ot as normalizeOptionalSessionKey, Pn as resolveAgentTimeoutMs, Pt as hasLegacyDeliveryHints, Q as setCliSessionId, R as buildHistoryContextFromEntries, Rt as buildSafeExternalPrompt, S as computeBackoff, Sr as registerAgentRunContext, Tn as DEFAULT_INPUT_IMAGE_MAX_BYTES, Vt as isExternalHookSession, Wt as consumeGatewaySigusr1RestartAuthorization, X as resolveCronStyleNow, Xt as setGatewaySigusr1RestartPolicy, Z as getCliSessionId, Zt as setPreRestartDeferralCheck, _ as loadSymiPlugins, _r as stripHeartbeatToken, b as readJsonBodyWithLimit, br as getAgentRunContext, bt as summarizeRestartSentinel, c as runEmbeddedPiAgent, cr as getTotalQueueSize, dr as waitForActiveTasks, f as applyToolPolicyPipeline, fr as CommandLane, ft as resetDirectoryCache, gt as consumeRestartSentinel, h as getPluginToolMeta, j as resolveAgentAvatar, jn as normalizeMimeList, jt as normalizeRequiredName, k as createDefaultDeps, kn as extractFileContentFromSource, kt as normalizeOptionalText, ln as requestHeartbeatNow, lr as resetAllLanes, lt as resolveOutboundTarget, mt as runWithModelFallback, n as initSubagentRegistry, nt as readLatestAssistantReply, o as runSubagentAnnounceFlow, or as getActiveTaskCount, ot as resolveOutboundSessionRoute, p as buildDefaultToolPolicyPipelineSteps, pr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, qt as isGatewaySigusr1RestartExternallyAllowed, r as listDescendantRunsForRequester, rt as resolveAnnounceTargetFromKey, t as countActiveDescendantRuns, tt as createSymiTools, u as getActiveEmbeddedRunCount, ur as setCommandLaneConcurrency, ut as resolveSessionDeliveryTarget, vr as clearAgentRunContext, vt as formatRestartSentinelMessage, w as agentCommand, x as requestBodyErrorToText, xn as enqueueSystemEvent, xr as onAgentEvent, y as handleSlackHttpRequest, yr as emitAgentEvent, zt as detectSuspiciousPatterns } from "./subagent-registry-Bdq971iu.js";
24
+ import { $ as setCliSessionId, A as createDefaultDeps, An as extractFileContentFromSource, At as normalizeOptionalText, Bt as detectSuspiciousPatterns, C as computeBackoff, Cr as registerAgentRunContext, Dn as DEFAULT_INPUT_IMAGE_MIMES, Dt as inferLegacyName, En as DEFAULT_INPUT_IMAGE_MAX_BYTES, Fn as resolveAgentTimeoutMs, Ft as hasLegacyDeliveryHints, Gt as consumeGatewaySigusr1RestartAuthorization, Ht as isExternalHookSession, It as stripLegacyDeliveryFields, Jt as isGatewaySigusr1RestartExternallyAllowed, K as getTotalPendingReplies, Kt as deferGatewayRestartUntilIdle, M as resolveAgentAvatar, Mn as normalizeMimeList, Mt as normalizeRequiredName, Nn as resolveInputFileLimits, Nt as migrateLegacyCronPayload, On as DEFAULT_INPUT_MAX_REDIRECTS, Ot as normalizeOptionalAgentId, Pt as buildDeliveryFromLegacyPayload, Q as getCliSessionId, Qt as setPreRestartDeferralCheck, S as requestBodyErrorToText, Sn as enqueueSystemEvent, Sr as onAgentEvent, T as agentCommand, Vt as getHookType, Yt as markGatewaySigusr1RestartHandled, Z as resolveCronStyleNow, Zt as setGatewaySigusr1RestartPolicy, _t as consumeRestartSentinel, b as handleSlackHttpRequest, br as emitAgentEvent, d as getActiveEmbeddedRunCount, dr as setCommandLaneConcurrency, dt as resolveSessionDeliveryTarget, et as runCliAgent, fr as waitForActiveTasks, g as getPluginToolMeta, ht as runWithModelFallback, i as listDescendantRunsForRequester, it as resolveAnnounceTargetFromKey, jn as extractImageContentFromSource, jt as normalizePayloadToSystemText, k as createOutboundSendDeps, kn as DEFAULT_INPUT_TIMEOUT_MS, kt as normalizeOptionalSessionKey, l as runEmbeddedPiAgent, lr as getTotalQueueSize, m as buildDefaultToolPolicyPipelineSteps, mr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, n as countActiveRunsForSession, nt as createSymiTools, p as applyToolPolicyPipeline, pr as CommandLane, pt as resetDirectoryCache, qt as emitGatewayRestart, r as initSubagentRegistry, rt as readLatestAssistantReply, s as runSubagentAnnounceFlow, sr as getActiveTaskCount, st as resolveOutboundSessionRoute, t as countActiveDescendantRuns, un as requestHeartbeatNow, ur as resetAllLanes, ut as resolveOutboundTarget, v as loadSymiPlugins, vr as stripHeartbeatToken, w as sleepWithAbort, wt as normalizeHttpWebhookUrl, x as readJsonBodyWithLimit, xr as getAgentRunContext, xt as summarizeRestartSentinel, yr as clearAgentRunContext, yt as formatRestartSentinelMessage, z as buildHistoryContextFromEntries, zt as buildSafeExternalPrompt } from "./subagent-registry-BSgPGZxs.js";
25
25
  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-Cb4Hj78H.js";
26
26
  import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-Csntmwwn.js";
27
27
  import { n as listChannelPlugins, o as normalizeWhatsAppTarget, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-CwSlLxM8.js";
@@ -130,20 +130,20 @@ import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } fr
130
130
  import { i as toOptionString, n as extractGatewayMiskeys, r as maybeExplainGatewayServiceStop, t as describeUnknownError } from "./shared-BtG9rny3.js";
131
131
  import { c as probeGateway, s as resolveNodeCommandAllowlist } from "./audit-F6tyY79q.js";
132
132
  import { t as discoverGatewayBeacons } from "./bonjour-discovery-CA_XIzr_.js";
133
- import { i as pickGatewaySelfPresence } from "./status-B0E2EIVt.js";
134
- import { a as styleHealthChannelLine, l as startHeartbeatRunner, n as getHealthSnapshot, s as runHeartbeatOnce, t as formatHealthChannelLines } from "./health-C1DLgFhT.js";
133
+ import { i as pickGatewaySelfPresence } from "./status-B7VIwi53.js";
134
+ import { a as styleHealthChannelLine, l as startHeartbeatRunner, n as getHealthSnapshot, s as runHeartbeatOnce, t as formatHealthChannelLines } from "./health-BpVkd1NR.js";
135
135
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-BseSWee1.js";
136
136
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, m as normalizeUpdateChannel, n as compareSemverStrings, t as checkUpdateStatus } from "./update-check-ZdimP1aU.js";
137
- import { t as runOnboardingWizard } from "./onboarding-DtTOnF5l.js";
138
- import { _ as getHandshakeTimeoutMs, a as DEFAULT_ASSISTANT_IDENTITY, b as resolveCronRunLogPath, c as upsertPresence, d as DEDUPE_MAX, f as DEDUPE_TTL_MS, g as TICK_INTERVAL_MS, h as MAX_PAYLOAD_BYTES, i as safeParseJson, l as formatError, m as MAX_BUFFERED_BYTES, n as handleGatewayRequest, o as resolveAssistantIdentity, p as HEALTH_REFRESH_INTERVAL_MS, r as broadcastPresenceSnapshot, s as listSystemPresence, t as coreGatewayHandlers, u as loadVoiceWakeConfig, v as abortChatRunById, x as startGatewayConfigReloader, y as appendCronRunLog } from "./server-methods-Br0D7ovX.js";
139
- import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-ClGMwC80.js";
137
+ import { t as runOnboardingWizard } from "./onboarding-HJJedJ3u.js";
138
+ import { _ as getHandshakeTimeoutMs, a as DEFAULT_ASSISTANT_IDENTITY, b as resolveCronRunLogPath, c as upsertPresence, d as DEDUPE_MAX, f as DEDUPE_TTL_MS, g as TICK_INTERVAL_MS, h as MAX_PAYLOAD_BYTES, i as safeParseJson, l as formatError, m as MAX_BUFFERED_BYTES, n as handleGatewayRequest, o as resolveAssistantIdentity, p as HEALTH_REFRESH_INTERVAL_MS, r as broadcastPresenceSnapshot, s as listSystemPresence, t as coreGatewayHandlers, u as loadVoiceWakeConfig, v as abortChatRunById, x as startGatewayConfigReloader, y as appendCronRunLog } from "./server-methods-1TVNg0k5.js";
139
+ import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-DtKC_-eP.js";
140
140
  import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-CzWeiE-Y.js";
141
- import "./agents.config-3mkYv9BE.js";
141
+ import "./agents.config-D4WnZfkE.js";
142
142
  import "./dm-policy-shared-DJ-61hCT.js";
143
143
  import "./node-service-fcZExd22.js";
144
144
  import "./status.update-D8lzj5TK.js";
145
145
  import "./skills-install-1ZdwGTnh.js";
146
- import "./update-runner-FuqSMzV5.js";
146
+ import "./update-runner-ChoWv-od.js";
147
147
  import { t as resolveAgentSessionDirs } from "./session-dirs-DWgIYmAt.js";
148
148
  import { i as shouldIncludeHook, r as resolveHookConfig, t as loadWorkspaceHookEntries } from "./workspace-B51TF6q3.js";
149
149
  import { n as forceFreePortAndWait } from "./ports-Dn122MUd.js";
@@ -2051,6 +2051,7 @@ function createAgentEventHandler({ broadcast, broadcastToConnIds, nodeSendToSess
2051
2051
  sessionKey,
2052
2052
  seq,
2053
2053
  state: "final",
2054
+ activeSubagentCount: countActiveRunsForSession(sessionKey),
2054
2055
  ...heartbeatCtx?.isHeartbeat ? { isHeartbeat: true } : {},
2055
2056
  message: text && !shouldSuppressSilent ? {
2056
2057
  role: "assistant",
@@ -2136,6 +2137,18 @@ function createAgentEventHandler({ broadcast, broadcastToConnIds, nodeSendToSess
2136
2137
  if (recipients && recipients.size > 0) broadcastToConnIds("agent", toolPayload, recipients);
2137
2138
  } else broadcast("agent", agentPayload);
2138
2139
  const lifecyclePhase = evt.stream === "lifecycle" && typeof evt.data?.phase === "string" ? evt.data.phase : null;
2140
+ if (lifecyclePhase && sessionKey && sessionKey.includes(":subagent:")) {
2141
+ if (lifecyclePhase === "start") broadcast("subagent", {
2142
+ phase: "started",
2143
+ sessionKey,
2144
+ runId: clientRunId
2145
+ });
2146
+ else if (lifecyclePhase === "end" || lifecyclePhase === "error") broadcast("subagent", {
2147
+ phase: "completed",
2148
+ sessionKey,
2149
+ runId: clientRunId
2150
+ });
2151
+ }
2139
2152
  if (sessionKey) {
2140
2153
  if (!isToolEvent || toolVerbose !== "off") nodeSendToSession(sessionKey, "agent", isToolEvent ? toolPayload : agentPayload);
2141
2154
  if (!isAborted && evt.stream === "assistant" && typeof evt.data?.text === "string") emitChatDelta(sessionKey, clientRunId, evt.runId, evt.seq, evt.data.text);
@@ -11633,7 +11646,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
11633
11646
  });
11634
11647
  let glassUiBridgeCleanup = null;
11635
11648
  if (!minimalTestGateway) {
11636
- const { createGlassUiBridge } = await import("./glass-ui-ws-CRdvmB5D.js");
11649
+ const { createGlassUiBridge } = await import("./glass-ui-ws-BvSaDLuk.js");
11637
11650
  glassUiBridgeCleanup = createGlassUiBridge({
11638
11651
  wss: glassUiWss,
11639
11652
  context: gatewayRequestContext,
@@ -13,7 +13,7 @@ import "./client-DMBZpU6X.js";
13
13
  import "./call-C7OJzLEL.js";
14
14
  import "./message-channel-C9dERklz.js";
15
15
  import "./pairing-token-Byh6drgn.js";
16
- import "./subagent-registry-Bdq971iu.js";
16
+ import "./subagent-registry-BSgPGZxs.js";
17
17
  import "./sessions-Cb4Hj78H.js";
18
18
  import "./tokens-Csntmwwn.js";
19
19
  import "./plugins-CwSlLxM8.js";
@@ -108,18 +108,18 @@ import "./service-Cm9j9WzQ.js";
108
108
  import "./diagnostics-CS1ov_hH.js";
109
109
  import "./table-D01d2GuY.js";
110
110
  import "./audit-F6tyY79q.js";
111
- import "./status-B0E2EIVt.js";
112
- import "./health-C1DLgFhT.js";
111
+ import "./status-B7VIwi53.js";
112
+ import "./health-BpVkd1NR.js";
113
113
  import "./control-ui-assets-BseSWee1.js";
114
114
  import "./update-check-ZdimP1aU.js";
115
- import { n as handleGatewayRequest } from "./server-methods-Br0D7ovX.js";
116
- import "./push-apns-ClGMwC80.js";
117
- import "./agents.config-3mkYv9BE.js";
115
+ import { n as handleGatewayRequest } from "./server-methods-1TVNg0k5.js";
116
+ import "./push-apns-DtKC_-eP.js";
117
+ import "./agents.config-D4WnZfkE.js";
118
118
  import "./dm-policy-shared-DJ-61hCT.js";
119
119
  import "./node-service-fcZExd22.js";
120
120
  import "./status.update-D8lzj5TK.js";
121
121
  import "./skills-install-1ZdwGTnh.js";
122
- import "./update-runner-FuqSMzV5.js";
122
+ import "./update-runner-ChoWv-od.js";
123
123
 
124
124
  //#region src/gateway/glass-ui-ws.ts
125
125
  const SESSION_KEY = "agent:main:main";
@@ -163,6 +163,10 @@ function createGlassUiBridge(opts) {
163
163
  type: "agent",
164
164
  payload
165
165
  });
166
+ else if (event === "subagent") broadcastToBrowsers({
167
+ type: "subagent",
168
+ payload
169
+ });
166
170
  });
167
171
  /** Dispatch an RPC method through the gateway's internal handler. */
168
172
  async function dispatchRpc(method, params) {
@@ -1,7 +1,7 @@
1
1
  import "./paths-Cqn-zk3M.js";
2
2
  import "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import "./reply-BGBRWu_r.js";
4
+ import "./reply-BnAPNcvn.js";
5
5
  import "./registry-Cja8eT7G.js";
6
6
  import "./subsystem-D9vIQve0.js";
7
7
  import "./exec-CWkblSrI.js";
@@ -113,18 +113,18 @@ import "./service-Cl74hx8J.js";
113
113
  import "./diagnostics-BAMlsVVX.js";
114
114
  import "./table-BTgkRafz.js";
115
115
  import "./audit-CbxXbquQ.js";
116
- import "./status-BGds6W9t.js";
117
- import "./health-CJoGuAfg.js";
116
+ import "./status-CCrlpUEA.js";
117
+ import "./health-6atzBDlL.js";
118
118
  import "./control-ui-assets-Z947tKLt.js";
119
119
  import "./update-check-CtckACbb.js";
120
- import { n as handleGatewayRequest } from "./server-methods-D_xNgVRl.js";
121
- import "./push-apns-CHAQFZbY.js";
122
- import "./agents.config-pj-OsrUT.js";
120
+ import { n as handleGatewayRequest } from "./server-methods-CYVVBHwG.js";
121
+ import "./push-apns-CpUJIlI7.js";
122
+ import "./agents.config-qyBeLoW5.js";
123
123
  import "./dm-policy-shared-Bh3TbexU.js";
124
124
  import "./node-service-Cxz4e-Qd.js";
125
125
  import "./status.update-Cu6R3wwz.js";
126
126
  import "./skills-install-D67isO1L.js";
127
- import "./update-runner-D6WDlrp3.js";
127
+ import "./update-runner-Dm7EwGFW.js";
128
128
 
129
129
  //#region src/gateway/glass-ui-ws.ts
130
130
  const SESSION_KEY = "agent:main:main";
@@ -168,6 +168,10 @@ function createGlassUiBridge(opts) {
168
168
  type: "agent",
169
169
  payload
170
170
  });
171
+ else if (event === "subagent") broadcastToBrowsers({
172
+ type: "subagent",
173
+ payload
174
+ });
171
175
  });
172
176
  /** Dispatch an RPC method through the gateway's internal handler. */
173
177
  async function dispatchRpc(method, params) {
@@ -1,5 +1,5 @@
1
1
  import { B as theme, k as info, l as escapeRegExp, z as isRich } from "./utils-B-0b9bGM.js";
2
- import { Ft as resolveHeartbeatSenderContext, Pt as resolveHeartbeatDeliveryTarget, ar as CommandLane, cr as isHeartbeatContentEffectivelyEmpty, dt as requestHeartbeatNow, er as getQueueSize, ft as setHeartbeatWakeHandler, lr as resolveHeartbeatPrompt$1, or as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, pt as resolveHeartbeatReasonKind, r as appendCronStyleCurrentTimeLine, sr as DEFAULT_HEARTBEAT_EVERY, t as getReplyFromConfig, ur as stripHeartbeatToken, xr as peekSystemEventEntries, zn as resolveUserTimezone } from "./reply-BGBRWu_r.js";
2
+ import { Bn as resolveUserTimezone, Ft as resolveHeartbeatSenderContext, Pt as resolveHeartbeatDeliveryTarget, Sr as peekSystemEventEntries, cr as DEFAULT_HEARTBEAT_EVERY, dr as stripHeartbeatToken, dt as requestHeartbeatNow, ft as setHeartbeatWakeHandler, lr as isHeartbeatContentEffectivelyEmpty, or as CommandLane, pt as resolveHeartbeatReasonKind, r as appendCronStyleCurrentTimeLine, sr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, t as getReplyFromConfig, tr as getQueueSize, ur as resolveHeartbeatPrompt$1 } from "./reply-BnAPNcvn.js";
3
3
  import { l as resolveAgentIdFromSessionKey, p as toAgentStoreSessionKey, s as normalizeAgentId } from "./session-key-DCt45XZa.js";
4
4
  import { f as defaultRuntime, t as createSubsystemLogger } from "./subsystem-D9vIQve0.js";
5
5
  import { b as DEFAULT_SYMIPULSE_FILENAME, c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId, r as resolveAgentConfig } from "./agent-scope-CgUHAtCo.js";
@@ -4,7 +4,7 @@ import { l as resolveAgentIdFromSessionKey, p as toAgentStoreSessionKey, s as no
4
4
  import { b as DEFAULT_SYMIPULSE_FILENAME, c as resolveAgentWorkspaceDir, l as resolveDefaultAgentId, r as resolveAgentConfig } from "./agent-scope-D-jRCY0d.js";
5
5
  import { C as parseDurationMs, i as loadConfig } from "./config-CJigbfdK.js";
6
6
  import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-C7OJzLEL.js";
7
- import { Cn as peekSystemEventEntries, Kn as resolveUserTimezone, Y as appendCronStyleCurrentTimeLine, _r as stripHeartbeatToken, ct as resolveHeartbeatSenderContext, dn as resolveHeartbeatReasonKind, fr as CommandLane, gr as resolveHeartbeatPrompt$1, hr as isHeartbeatContentEffectivelyEmpty, ln as requestHeartbeatNow, mr as DEFAULT_HEARTBEAT_EVERY, pr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, q as getReplyFromConfig, sr as getQueueSize, st as resolveHeartbeatDeliveryTarget, un as setHeartbeatWakeHandler } from "./subagent-registry-Bdq971iu.js";
7
+ import { J as getReplyFromConfig, X as appendCronStyleCurrentTimeLine, _r as resolveHeartbeatPrompt$1, cr as getQueueSize, ct as resolveHeartbeatDeliveryTarget, dn as setHeartbeatWakeHandler, fn as resolveHeartbeatReasonKind, gr as isHeartbeatContentEffectivelyEmpty, hr as DEFAULT_HEARTBEAT_EVERY, lt as resolveHeartbeatSenderContext, mr as DEFAULT_HEARTBEAT_ACK_MAX_CHARS, pr as CommandLane, qn as resolveUserTimezone, un as requestHeartbeatNow, vr as stripHeartbeatToken, wn as peekSystemEventEntries } from "./subagent-registry-BSgPGZxs.js";
8
8
  import { M as canonicalizeMainSessionAlias, N as resolveAgentMainSessionKey, d as updateSessionStore, l as saveSessionStore, o as loadSessionStore } from "./sessions-Cb4Hj78H.js";
9
9
  import { r as SYMIPULSE_TOKEN } from "./tokens-Csntmwwn.js";
10
10
  import { n as listChannelPlugins, t as getChannelPlugin } from "./plugins-CwSlLxM8.js";
@@ -1,7 +1,7 @@
1
1
  import "./paths-Cqn-zk3M.js";
2
2
  import { B as theme, S as shortenHomePath, t as CONFIG_DIR, y as resolveUserPath } from "./utils-B-0b9bGM.js";
3
3
  import "./thinking-EAliFiVK.js";
4
- import "./reply-BGBRWu_r.js";
4
+ import "./reply-BnAPNcvn.js";
5
5
  import "./registry-Cja8eT7G.js";
6
6
  import { f as defaultRuntime } from "./subsystem-D9vIQve0.js";
7
7
  import "./exec-CWkblSrI.js";
@@ -108,7 +108,7 @@ import { a as installPackageDir, i as withTempDir, n as installFromNpmSpecArchiv
108
108
  import { t as renderTable } from "./table-BTgkRafz.js";
109
109
  import { a as parseFrontmatter, t as loadWorkspaceHookEntries } from "./workspace-CYxdoAlY.js";
110
110
  import { t as buildWorkspaceHookStatus } from "./hooks-status-BqLZtMLa.js";
111
- import { t as buildPluginStatusReport } from "./status-DT80WcHk.js";
111
+ import { t as buildPluginStatusReport } from "./status-BS3y9HjF.js";
112
112
  import fs from "node:fs";
113
113
  import path from "node:path";
114
114
  import fs$1 from "node:fs/promises";