@symerian/symi 3.5.27 → 3.5.28

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 (113) hide show
  1. package/dist/{agent-DxRVDqSg.js → agent-BsRYHa15.js} +1 -1
  2. package/dist/{agent-CB5yb-7V.js → agent-TRt_SsAW.js} +1 -1
  3. package/dist/{agents-DtRd3yEb.js → agents-7qMp2MWu.js} +2 -2
  4. package/dist/{auth-choice-5SLfZiQ7.js → auth-choice-C8lwYiEQ.js} +1 -1
  5. package/dist/{auth-choice-DQplW60s.js → auth-choice-DcB72YWZ.js} +1 -1
  6. package/dist/{banner-B_P_FrmA.js → banner-B5Hv4rlk.js} +1 -1
  7. package/dist/build-info.json +3 -3
  8. package/dist/bundled/boot-md/handler.js +2 -2
  9. package/dist/bundled/session-memory/handler.js +2 -2
  10. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  11. package/dist/{channel-options-DnWkDAWi.js → channel-options-DOzFci6h.js} +1 -1
  12. package/dist/{channel-options-8NGYZjfd.js → channel-options-ZkruGuHl.js} +1 -1
  13. package/dist/{channels-cli-Bx90nSmB.js → channels-cli-CEz9LILV.js} +7 -7
  14. package/dist/{channels-cli-CGCyzahW.js → channels-cli-DMShhX0d.js} +7 -7
  15. package/dist/{chrome-3jl2ulOE.js → chrome-DNssqQJs.js} +7 -7
  16. package/dist/{cli-DZAtyHzb.js → cli-Byovb_j5.js} +4 -4
  17. package/dist/{cli-DHG9iZJi.js → cli-MDHkESMC.js} +4 -4
  18. package/dist/{command-registry-DBbzZvh6.js → command-registry-Dzj-Uz5N.js} +10 -10
  19. package/dist/{completion-cli-Cbf0-8ob.js → completion-cli-CsJ2f_fk.js} +1 -1
  20. package/dist/{completion-cli-DoQrkCAd.js → completion-cli-vAwL_uEK.js} +2 -2
  21. package/dist/{config-cli-9a5qBcdo.js → config-cli-CqqCDyf0.js} +1 -1
  22. package/dist/{config-cli-D4RmoOxe.js → config-cli-cmea_Z-A.js} +1 -1
  23. package/dist/{configure-ryB8EvyP.js → configure-BEPKQuJj.js} +2 -2
  24. package/dist/{configure-kaf3aurx.js → configure-DymrZd1n.js} +2 -2
  25. package/dist/control-ui/css/style.css +115 -0
  26. package/dist/control-ui/index.html +14 -0
  27. package/dist/control-ui/js/symframe-bidirectional.js +210 -0
  28. package/dist/{deliver-f3cIWxXT.js → deliver-q23ar_Pm.js} +4 -4
  29. package/dist/{doctor-completion-Bk55g4MP.js → doctor-completion--phnyAqO.js} +1 -1
  30. package/dist/{doctor-completion--j-3qqz6.js → doctor-completion-BY72G6-l.js} +1 -1
  31. package/dist/entry.js +1 -1
  32. package/dist/extensionAPI.js +4 -4
  33. package/dist/{gateway-cli-B3FuQctH.js → gateway-cli-BVpyqk_H.js} +10 -10
  34. package/dist/{gateway-cli-BGMVOW2G.js → gateway-cli-Bo80TSkq.js} +10 -10
  35. package/dist/{glass-ui-ws-Z-W33_mF.js → glass-ui-ws-BK5qk7-_.js} +8 -8
  36. package/dist/{glass-ui-ws-BJcI_IdV.js → glass-ui-ws-CrmnRYxe.js} +8 -8
  37. package/dist/{hooks-cli-D43GEG-W.js → hooks-cli-CjklMDuK.js} +5 -5
  38. package/dist/{hooks-cli-Bn6x6Jnj.js → hooks-cli-CqmTdxT6.js} +5 -5
  39. package/dist/index.js +8 -8
  40. package/dist/llm-slug-generator.js +2 -2
  41. package/dist/{manager-Cw7IJGbB.js → manager-CL767Sv9.js} +1 -1
  42. package/dist/{manager-BHddoe4T.js → manager-NDn8AFhr.js} +1 -1
  43. package/dist/{manager-DH00nlW8.js → manager-XfNxjaX5.js} +1 -1
  44. package/dist/{manager-DbVMwpDc.js → manager-fgUC_sHR.js} +1 -1
  45. package/dist/{memory-C02Znuee.js → memory-CTf9MdBg.js} +2 -2
  46. package/dist/{memory-BZ24UkLW.js → memory-DOl2l2AS.js} +2 -2
  47. package/dist/{memory-cli-0HHYm-B8.js → memory-cli-B9_Vfaow.js} +2 -2
  48. package/dist/{memory-cli-083UJtVJ.js → memory-cli-CA5PbH9y.js} +2 -2
  49. package/dist/{models-Bh_frCup.js → models-DgiBOeVH.js} +2 -2
  50. package/dist/{models-cli-C2EXmrYH.js → models-cli-B7gTrlgn.js} +5 -5
  51. package/dist/{models-cli-BhBu4Dwm.js → models-cli-BHN3bt0f.js} +6 -6
  52. package/dist/{onboard-DnwWawQO.js → onboard-BNdKimpG.js} +1 -1
  53. package/dist/{onboard-BSxqEQfo.js → onboard-DGp6mHJD.js} +1 -1
  54. package/dist/{onboard-channels-BkR3MKMp.js → onboard-channels-DSBWRjSp.js} +1 -1
  55. package/dist/{onboard-channels-qDThNkyj.js → onboard-channels-Dhb-28-_.js} +1 -1
  56. package/dist/{onboarding-DxZAGVkD.js → onboarding-BG23DuS1.js} +3 -3
  57. package/dist/{onboarding-CrCGoZ4H.js → onboarding-MPSU9pXd.js} +3 -3
  58. package/dist/{onboarding.finalize-BYzduVFA.js → onboarding.finalize-B-mxzJ08.js} +4 -4
  59. package/dist/{onboarding.finalize-Dt-rcgpk.js → onboarding.finalize-Cv20GyNt.js} +3 -3
  60. package/dist/{pi-embedded-DGnpyHm-.js → pi-embedded-V-5MAZNb.js} +11 -10
  61. package/dist/{plugin-registry-D2_TLnOr.js → plugin-registry-CBV_Y6Dj.js} +1 -1
  62. package/dist/{plugin-registry-B74FBx4U.js → plugin-registry-c3Skr0q9.js} +1 -1
  63. package/dist/{plugins-cli-Cmf3kRf5.js → plugins-cli-8Jo1X8SU.js} +5 -5
  64. package/dist/{plugins-cli-CqV1Q7ao.js → plugins-cli-Dl7-FSCq.js} +5 -5
  65. package/dist/{program-CGuYYumL.js → program-D-LYHEvk.js} +10 -10
  66. package/dist/{program-context-B0ovpbFU.js → program-context-BpeLcVUB.js} +18 -18
  67. package/dist/{prompt-select-styled-B5GrNfqR.js → prompt-select-styled-Ceih9wkY.js} +4 -4
  68. package/dist/{prompt-select-styled-b752FPLG.js → prompt-select-styled-ZWxB2Odf.js} +4 -4
  69. package/dist/{provider-auth-helpers-DU8RlQz7.js → provider-auth-helpers-BCejcf5o.js} +1 -1
  70. package/dist/{provider-auth-helpers-BKveYcEH.js → provider-auth-helpers-BdvW7eau.js} +1 -1
  71. package/dist/{push-apns-HNg0rTkI.js → push-apns-D4iLNyBo.js} +1 -1
  72. package/dist/{push-apns-CyAPMMJC.js → push-apns-HQd5hCpM.js} +1 -1
  73. package/dist/{pw-ai-DOAsQ5NX.js → pw-ai-v__CyAlM.js} +1 -1
  74. package/dist/{register.agent-DbPYGG3u.js → register.agent-DoUbqZIu.js} +9 -9
  75. package/dist/{register.agent-BKbQhrre.js → register.agent-zwVEiCHs.js} +8 -8
  76. package/dist/{register.configure-C4_ShaQV.js → register.configure-CSe8Rlda.js} +8 -8
  77. package/dist/{register.configure-B0M15y31.js → register.configure-jBKvvOnk.js} +8 -8
  78. package/dist/{register.maintenance-bzLNOqch.js → register.maintenance-BdikNAV1.js} +9 -9
  79. package/dist/{register.maintenance-BOYWTu9C.js → register.maintenance-royLmVA2.js} +8 -8
  80. package/dist/{register.message-Bfukmte_.js → register.message-C1H5Vcnb.js} +5 -5
  81. package/dist/{register.message-BtCthbpo.js → register.message-C_0uLdYn.js} +5 -5
  82. package/dist/{register.onboard-D5GmuX8K.js → register.onboard-DTLtb0SN.js} +2 -2
  83. package/dist/{register.onboard-CDsSVoFI.js → register.onboard-DnMRUtnl.js} +2 -2
  84. package/dist/{register.setup-Bp8rYeRx.js → register.setup-B9sjRH7l.js} +2 -2
  85. package/dist/{register.setup-DzospfSf.js → register.setup-KA8Cs3HJ.js} +2 -2
  86. package/dist/{register.status-health-sessions-NVbWTQpZ.js → register.status-health-sessions-B_jcsH3c.js} +3 -3
  87. package/dist/{register.status-health-sessions-DE2db_Uo.js → register.status-health-sessions-BwiKHLEj.js} +3 -3
  88. package/dist/{register.subclis-QXO75pUm.js → register.subclis-B_V8vNI0.js} +9 -9
  89. package/dist/{run-main-MD8Z8ydF.js → run-main-DhgQtxI0.js} +17 -17
  90. package/dist/{server-methods-Bl41VzMu.js → server-methods-6-10RyMD.js} +7 -7
  91. package/dist/{server-methods-DTkVQH8Q.js → server-methods-Bdz-OwQ4.js} +7 -7
  92. package/dist/{server-node-events-C0smPxrR.js → server-node-events-B3Yey3h9.js} +6 -6
  93. package/dist/{server-node-events-CxYKzrbU.js → server-node-events-C4giIb7q.js} +6 -6
  94. package/dist/{status-DrWy5OkC.js → status-BRUIJsUm.js} +1 -1
  95. package/dist/{status-OTYFx93W.js → status-B_CQpjQ9.js} +1 -1
  96. package/dist/{status-D7QX7VDk.js → status-CCAO6ZHm.js} +1 -1
  97. package/dist/{status-BEZotN01.js → status-D_0593yR.js} +1 -1
  98. package/dist/{subagent-registry-CVhLz4p3.js → subagent-registry-D8BIWG9Q.js} +4 -3
  99. package/dist/{synthesis-C1mZnGqD.js → synthesis-BfVWACNx.js} +4 -4
  100. package/dist/{synthesis-ts2nG0tK.js → synthesis-CV94EuT_.js} +4 -4
  101. package/dist/{synthesis-CO5pr92g.js → synthesis-D6pnRAxI.js} +2 -2
  102. package/dist/{synthesis-RhT991Ni.js → synthesis-qvteT0Ti.js} +4 -4
  103. package/dist/{unified-runner-4O0ifBsI.js → unified-runner-CtSJoaGS.js} +4 -3
  104. package/dist/{unified-runner-O3qR5Iie.js → unified-runner-H3Qh_NZO.js} +4 -3
  105. package/dist/{update-cli-BMURsYJU.js → update-cli-BrryYmFA.js} +8 -8
  106. package/dist/{update-cli-D9g9s187.js → update-cli-CUos9qgT.js} +9 -9
  107. package/extensions/memory-core/package.json +1 -1
  108. package/extensions/msteams/CHANGELOG.md +6 -0
  109. package/extensions/msteams/package.json +1 -1
  110. package/extensions/open-prose/package.json +1 -1
  111. package/extensions/outlook/package.json +1 -1
  112. package/extensions/slack/package.json +1 -1
  113. package/package.json +1 -1
@@ -961,6 +961,121 @@ body {
961
961
  color: var(--text);
962
962
  }
963
963
 
964
+ /* ── Stage E (3.5.28): considering button ─────────────────────── */
965
+ /* "What are you considering?" — clicking dwells every weighing card
966
+ AND adds .considering-weighing to #symframe (CSS below) which dims
967
+ non-weighing cards for the duration. */
968
+ .considering-btn {
969
+ margin-left: 4px;
970
+ padding: 2px 7px;
971
+ font-size: 11px;
972
+ line-height: 1;
973
+ font-family: var(--font-mono);
974
+ color: #f5b73a; /* amber — same hue as weighing intent */
975
+ background: transparent;
976
+ border: 1px solid rgba(245, 183, 58, 0.32);
977
+ border-radius: 8px;
978
+ cursor: pointer;
979
+ transition:
980
+ background 0.15s ease,
981
+ border-color 0.15s ease,
982
+ transform 0.15s ease;
983
+ }
984
+ .considering-btn:hover {
985
+ background: rgba(245, 183, 58, 0.12);
986
+ border-color: #f5b73a;
987
+ }
988
+ .considering-btn:active {
989
+ transform: scale(0.95);
990
+ }
991
+ /* Brief red flash when clicked while no weighing cards exist —
992
+ tells the user "I have nothing to surface here." */
993
+ .considering-btn.considering-empty {
994
+ animation: considering-empty-pulse 0.8s ease-out;
995
+ }
996
+ @keyframes considering-empty-pulse {
997
+ 0%,
998
+ 100% {
999
+ border-color: rgba(245, 183, 58, 0.32);
1000
+ }
1001
+ 50% {
1002
+ border-color: rgba(244, 114, 182, 0.6);
1003
+ background: rgba(244, 114, 182, 0.1);
1004
+ }
1005
+ }
1006
+ /* While considering-weighing is active, dim non-weighing cards so the
1007
+ weighing ones (now pulsing from dwell) stand out. */
1008
+ .symframe.considering-weighing .symframe-card-dynamic:not([data-intent="weighing"]) {
1009
+ opacity: 0.32;
1010
+ filter: blur(1px);
1011
+ transition:
1012
+ opacity 0.4s ease,
1013
+ filter 0.4s ease;
1014
+ }
1015
+ .symframe.considering-weighing .symframe-substrate {
1016
+ opacity: 0.45;
1017
+ transition: opacity 0.4s ease;
1018
+ }
1019
+ @media (prefers-reduced-motion: reduce) {
1020
+ .considering-btn.considering-empty {
1021
+ animation: none;
1022
+ }
1023
+ .symframe.considering-weighing .symframe-card-dynamic:not([data-intent="weighing"]) {
1024
+ transition: opacity 0.2s ease;
1025
+ filter: none;
1026
+ }
1027
+ }
1028
+
1029
+ /* ── Stage E (3.5.28): mention-binding spans ──────────────────── */
1030
+ /* When an assistant chat message contains `[panel:<card-id>]`, the
1031
+ mention-binding scanner replaces the literal text with a clickable
1032
+ .panel-ref span showing the card's title. Clicking the span dwells
1033
+ the referenced card (cyan border pulse). */
1034
+ .panel-ref {
1035
+ display: inline;
1036
+ color: var(--accent-cyan);
1037
+ border-bottom: 1px dashed currentColor;
1038
+ cursor: pointer;
1039
+ font-weight: 500;
1040
+ padding: 0 2px;
1041
+ border-radius: 3px;
1042
+ transition:
1043
+ background 0.15s ease,
1044
+ border-bottom-style 0.15s ease;
1045
+ }
1046
+ .panel-ref::before {
1047
+ content: "↗ ";
1048
+ font-size: 0.85em;
1049
+ opacity: 0.7;
1050
+ }
1051
+ .panel-ref:hover {
1052
+ background: rgba(0, 212, 255, 0.12);
1053
+ border-bottom-style: solid;
1054
+ }
1055
+ /* Orphan reference — the card is no longer in the panel. Subdued so
1056
+ the user sees the link works but the card isn't currently here. */
1057
+ .panel-ref.panel-ref-orphan {
1058
+ color: var(--text-dim);
1059
+ opacity: 0.7;
1060
+ }
1061
+ .panel-ref.panel-ref-orphan::before {
1062
+ content: "↗ ";
1063
+ }
1064
+ /* Click-miss flash: a brief pink tint signals "I tried to dwell but
1065
+ that card isn't currently registered." */
1066
+ .panel-ref.panel-ref-miss {
1067
+ animation: panel-ref-miss-pulse 1s ease-out;
1068
+ }
1069
+ @keyframes panel-ref-miss-pulse {
1070
+ 0%,
1071
+ 100% {
1072
+ background: rgba(0, 212, 255, 0.12);
1073
+ }
1074
+ 50% {
1075
+ background: rgba(244, 114, 182, 0.22);
1076
+ }
1077
+ }
1078
+
964
1079
  /* ── Per-mode layout overrides ───────────────────────────────── */
965
1080
  /* Default (ambient): inherits the base .symframe grid above —
966
1081
  auto / 1fr / auto rows. No override needed. */
@@ -242,6 +242,19 @@
242
242
  <button type="button" class="mode-auto" id="mode-auto" hidden title="Release to agent">
243
243
  AUTO
244
244
  </button>
245
+ <!-- Stage E (3.5.28): "what are you considering?" — clicking -->
246
+ <!-- this dwells every weighing card and dims non-weighing cards -->
247
+ <!-- for ~5s. Direct visual answer to "what options is the agent -->
248
+ <!-- holding open right now?" -->
249
+ <button
250
+ type="button"
251
+ class="considering-btn"
252
+ id="considering-btn"
253
+ title="What are you considering? (highlights weighing cards)"
254
+ aria-label="Highlight weighing cards"
255
+ >
256
+
257
+ </button>
245
258
  </div>
246
259
  <div class="symframe-sub">window into the agent's mind</div>
247
260
  </div>
@@ -1029,5 +1042,6 @@
1029
1042
  <script src="js/symframe-substrate.js"></script>
1030
1043
  <script src="js/symframe-awaiting.js"></script>
1031
1044
  <script src="js/symframe-modes.js"></script>
1045
+ <script src="js/symframe-bidirectional.js"></script>
1032
1046
  </body>
1033
1047
  </html>
@@ -0,0 +1,210 @@
1
+ // ── Symframe Bidirectional ──────────────────────────────────────────
2
+ // Stage E of the Dynamic Glass Panel arc — see ~/Documents/dynamic-glass-panel.md §5 Stage E.
3
+ //
4
+ // Two user-facing features that bridge the chat column and the symframe:
5
+ //
6
+ // 1. Mention-binding (agent → user direction)
7
+ // When the agent writes `[panel:<card-id>]` in a chat message, this
8
+ // module rewrites the literal text into a clickable span showing the
9
+ // card's title (or id if no title) AND auto-pulses (dwell) the
10
+ // referenced card. Clicking the span re-pulses. Fresh messages
11
+ // auto-dwell once on first render; history-loaded messages get
12
+ // clickable spans but no auto-dwell (so a session with 50 referenced
13
+ // messages doesn't dwell 50 times on reload).
14
+ //
15
+ // 2. "What are you considering?" (user → agent introspection)
16
+ // Small button in the symframe header. On click, dwells every
17
+ // weighing card AND adds .considering-weighing to #symframe which
18
+ // dims non-weighing cards for ~5s. Direct visual answer to "what
19
+ // options are the agent holding open right now?"
20
+ //
21
+ // Implementation notes:
22
+ // - Mention-scanning runs on a 500ms interval over all unscanned
23
+ // assistant bubbles; once processed, a bubble gets the
24
+ // .mentions-scanned class and is skipped. Streaming bubbles
25
+ // (.stream-bubble without .done) are skipped until they finalize.
26
+ // - The pageReadyAt + 1500ms grace window suppresses the initial
27
+ // auto-dwell flood from history reload.
28
+ // - The considering button reads window.symframe.list() to find
29
+ // weighing cards. Sticky cards (subagents/scheduling panels —
30
+ // mostly gone post-Stage-C, but defensive) are excluded.
31
+ // ─────────────────────────────────────────────────────────────────────
32
+
33
+ "use strict";
34
+
35
+ (function () {
36
+ const PANEL_REF_PATTERN = /\[panel:([a-zA-Z0-9_-]+)\]/g;
37
+ const SCAN_INTERVAL_MS = 500;
38
+ const PAGE_READY_AT = Date.now() + 1500;
39
+ const CONSIDERING_DURATION_MS = 5000;
40
+
41
+ // ── Mention-binding ─────────────────────────────────────────────
42
+ function buildPanelRefSpan(id) {
43
+ const span = document.createElement("span");
44
+ span.className = "panel-ref";
45
+ span.dataset.cardId = id;
46
+ const cards = window.symframe?.list?.() || [];
47
+ const card = cards.find((c) => c.id === id);
48
+ const hasCard = !!card;
49
+ span.textContent = card?.title || id;
50
+ span.title = hasCard
51
+ ? `Click to pulse "${card.title || id}" in the panel`
52
+ : `Card "${id}" — not currently in the panel`;
53
+ if (!hasCard) {
54
+ span.classList.add("panel-ref-orphan");
55
+ }
56
+ span.addEventListener("click", (e) => {
57
+ e.preventDefault();
58
+ const result = window.symframe?.dwell?.(id);
59
+ if (!result) {
60
+ span.classList.add("panel-ref-miss");
61
+ setTimeout(() => span.classList.remove("panel-ref-miss"), 1000);
62
+ }
63
+ });
64
+ return span;
65
+ }
66
+
67
+ function walkTextNodes(node, callback) {
68
+ if (!node) {
69
+ return;
70
+ }
71
+ if (node.nodeType === Node.TEXT_NODE) {
72
+ callback(node);
73
+ return;
74
+ }
75
+ if (node.nodeType !== Node.ELEMENT_NODE) {
76
+ return;
77
+ }
78
+ const el = node;
79
+ // Skip elements we've already processed, code blocks, and links.
80
+ if (el.classList?.contains("panel-ref")) {
81
+ return;
82
+ }
83
+ if (el.tagName === "CODE" || el.tagName === "PRE" || el.tagName === "A") {
84
+ return;
85
+ }
86
+ for (const child of Array.from(el.childNodes)) {
87
+ walkTextNodes(child, callback);
88
+ }
89
+ }
90
+
91
+ function processMentionsIn(bubble) {
92
+ const matchedIds = [];
93
+ walkTextNodes(bubble, (textNode) => {
94
+ const text = textNode.textContent;
95
+ if (!text) {
96
+ return;
97
+ }
98
+ PANEL_REF_PATTERN.lastIndex = 0;
99
+ if (!PANEL_REF_PATTERN.test(text)) {
100
+ return;
101
+ }
102
+ PANEL_REF_PATTERN.lastIndex = 0;
103
+ const fragment = document.createDocumentFragment();
104
+ let lastIndex = 0;
105
+ let match;
106
+ while ((match = PANEL_REF_PATTERN.exec(text)) !== null) {
107
+ const literal = match[0];
108
+ const id = match[1];
109
+ if (match.index > lastIndex) {
110
+ fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));
111
+ }
112
+ fragment.appendChild(buildPanelRefSpan(id));
113
+ matchedIds.push(id);
114
+ lastIndex = match.index + literal.length;
115
+ }
116
+ if (lastIndex < text.length) {
117
+ fragment.appendChild(document.createTextNode(text.slice(lastIndex)));
118
+ }
119
+ textNode.replaceWith(fragment);
120
+ });
121
+
122
+ // Auto-dwell on fresh mentions only — suppress during the initial
123
+ // history-reload window so we don't flood with pulses.
124
+ if (matchedIds.length > 0 && Date.now() >= PAGE_READY_AT) {
125
+ for (const id of matchedIds) {
126
+ try {
127
+ window.symframe?.dwell?.(id);
128
+ } catch (err) {
129
+ console.warn("[symframe-bidirectional] dwell threw:", err);
130
+ }
131
+ }
132
+ }
133
+ }
134
+
135
+ function scanForMentions() {
136
+ const bubbles = document.querySelectorAll(".message.symi-msg .bubble:not(.mentions-scanned)");
137
+ for (const bubble of bubbles) {
138
+ // Skip still-streaming bubbles (delta still incoming)
139
+ if (bubble.classList.contains("stream-bubble") && !bubble.classList.contains("done")) {
140
+ continue;
141
+ }
142
+ processMentionsIn(bubble);
143
+ bubble.classList.add("mentions-scanned");
144
+ }
145
+ }
146
+
147
+ // ── "What are you considering?" gesture ──────────────────────────
148
+ let considerTimer = null;
149
+
150
+ function showConsidering() {
151
+ const symframeRoot = document.getElementById("symframe");
152
+ if (!symframeRoot) {
153
+ return;
154
+ }
155
+ const list = window.symframe?.list?.() || [];
156
+ const weighing = list.filter((c) => c.intent === "weighing" && !c.sticky);
157
+ if (weighing.length === 0) {
158
+ // Brief flash on the considering button itself to signal "no
159
+ // weighing cards right now"
160
+ const btn = document.getElementById("considering-btn");
161
+ if (btn) {
162
+ btn.classList.add("considering-empty");
163
+ setTimeout(() => btn.classList.remove("considering-empty"), 800);
164
+ }
165
+ return;
166
+ }
167
+ // Add the dimming class to non-weighing cards
168
+ symframeRoot.classList.add("considering-weighing");
169
+ // Dwell each weighing card (cyan halo pulses)
170
+ for (const c of weighing) {
171
+ try {
172
+ window.symframe?.dwell?.(c.id);
173
+ } catch (err) {
174
+ console.warn("[symframe-bidirectional] dwell threw:", err);
175
+ }
176
+ }
177
+ // Clear after the duration
178
+ if (considerTimer) {
179
+ clearTimeout(considerTimer);
180
+ }
181
+ considerTimer = setTimeout(() => {
182
+ symframeRoot.classList.remove("considering-weighing");
183
+ considerTimer = null;
184
+ }, CONSIDERING_DURATION_MS);
185
+ }
186
+
187
+ function wireConsideringButton() {
188
+ const btn = document.getElementById("considering-btn");
189
+ if (!btn) {
190
+ return;
191
+ }
192
+ btn.addEventListener("click", (e) => {
193
+ e.preventDefault();
194
+ showConsidering();
195
+ });
196
+ }
197
+
198
+ // ── Init ────────────────────────────────────────────────────────
199
+ function init() {
200
+ setInterval(scanForMentions, SCAN_INTERVAL_MS);
201
+ scanForMentions();
202
+ wireConsideringButton();
203
+ }
204
+
205
+ if (document.readyState === "loading") {
206
+ document.addEventListener("DOMContentLoaded", init);
207
+ } else {
208
+ init();
209
+ }
210
+ })();
@@ -9,7 +9,7 @@ import { r as normalizeChannelId, t as getChannelPlugin } from "./plugins-CZ_mYw
9
9
  import { _ as listDeliverableMessageChannels, c as resolveChunkMode, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, n as chunkByParagraph, v as normalizeMessageChannel } from "./chunk-CAZujdOi.js";
10
10
  import { c as loadConfig, d as writeConfigFile, m as parseByteSize, p as parseDurationMs, s as createConfigIO, t as SsrFBlockedError } from "./ssrf-BCSnhba8.js";
11
11
  import { t as parseBooleanValue } from "./boolean-BW6OTjPi.js";
12
- import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-3jl2ulOE.js";
12
+ import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-DNssqQJs.js";
13
13
  import { t as formatCliCommand } from "./command-format-DPd9RN2g.js";
14
14
  import { a as syncSkillsToWorkspace, l as resolveSandboxInputPath, m as sanitizeEnvVars, u as resolveSandboxPath } from "./skills-DO7WNsVJ.js";
15
15
  import { n as formatErrorMessage, t as extractErrorCode } from "./errors-BEU7IHU6.js";
@@ -1331,7 +1331,7 @@ function isModuleNotFoundError(err) {
1331
1331
  }
1332
1332
  async function loadPwAiModule(mode) {
1333
1333
  try {
1334
- return await import("./pw-ai-DOAsQ5NX.js");
1334
+ return await import("./pw-ai-v__CyAlM.js");
1335
1335
  } catch (err) {
1336
1336
  if (mode === "soft") return null;
1337
1337
  if (isModuleNotFoundError(err)) return null;
@@ -3928,11 +3928,11 @@ function createProfileContext(opts, profile) {
3928
3928
  const userDataDir = resolveSymiUserDataDir(profile.name);
3929
3929
  const profileState = getProfileState();
3930
3930
  if (await isHttpReachable(300) && !profileState.running) try {
3931
- await (await import("./pw-ai-DOAsQ5NX.js")).closePlaywrightBrowserConnection();
3931
+ await (await import("./pw-ai-v__CyAlM.js")).closePlaywrightBrowserConnection();
3932
3932
  } catch {}
3933
3933
  if (profileState.running) await stopRunningBrowser();
3934
3934
  try {
3935
- await (await import("./pw-ai-DOAsQ5NX.js")).closePlaywrightBrowserConnection();
3935
+ await (await import("./pw-ai-v__CyAlM.js")).closePlaywrightBrowserConnection();
3936
3936
  } catch {}
3937
3937
  if (!fs.existsSync(userDataDir)) return {
3938
3938
  moved: false,
@@ -1,7 +1,7 @@
1
1
  import { n as resolveCliName } from "./cli-name-DY75UA5M.js";
2
2
  import { t as resolveSymiPackageRoot } from "./symi-root-Ctw1Rb_n.js";
3
3
  import { t as note } from "./note-BIAQpZxi.js";
4
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-DoQrkCAd.js";
4
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-vAwL_uEK.js";
5
5
  import { spawnSync } from "node:child_process";
6
6
  import path from "node:path";
7
7
 
@@ -1,7 +1,7 @@
1
1
  import { n as resolveCliName } from "./cli-name-CzMV-gJF.js";
2
2
  import { t as resolveSymiPackageRoot } from "./symi-root-BQ0IpoW2.js";
3
3
  import { t as note } from "./note-D9FXI2qW.js";
4
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-Cbf0-8ob.js";
4
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-CsJ2f_fk.js";
5
5
  import path from "node:path";
6
6
  import { spawnSync } from "node:child_process";
7
7
 
package/dist/entry.js CHANGED
@@ -2315,7 +2315,7 @@ if (!ensureExperimentalWarningSuppressed()) {
2315
2315
  applyCliProfileEnv({ profile: parsed.profile });
2316
2316
  process$1.argv = parsed.argv;
2317
2317
  }
2318
- import("./run-main-MD8Z8ydF.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
2318
+ import("./run-main-DhgQtxI0.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
2319
2319
  console.error("[symi] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
2320
2320
  process$1.exitCode = 1;
2321
2321
  });
@@ -6,8 +6,8 @@ import { _ as DEFAULT_PROVIDER, g as DEFAULT_MODEL, p as resolveThinkingDefault
6
6
  import { a as resolveAgentIdentity } from "./reply-prefix-i-FPYcoQ.js";
7
7
  import "./plugins-CZ_mYwXq.js";
8
8
  import "./replies-0nzkXt6o.js";
9
- import { a as resolveAgentTimeoutMs, r as runEmbeddedPiAgent } from "./pi-embedded-DGnpyHm-.js";
10
- import { $ as loadSessionStore, nt as saveSessionStore } from "./deliver-f3cIWxXT.js";
9
+ import { a as resolveAgentTimeoutMs, r as runEmbeddedPiAgent } from "./pi-embedded-V-5MAZNb.js";
10
+ import { $ as loadSessionStore, nt as saveSessionStore } from "./deliver-q23ar_Pm.js";
11
11
  import "./diagnostic-BdRnGknC.js";
12
12
  import "./diagnostic-session-state-DpxCUzoM.js";
13
13
  import "./chunk-CAZujdOi.js";
@@ -16,14 +16,14 @@ import "./ssrf-BCSnhba8.js";
16
16
  import "./boolean-BW6OTjPi.js";
17
17
  import "./shell-env-DgjeObDZ.js";
18
18
  import "./manifest-registry-CAWGTwb5.js";
19
- import "./chrome-3jl2ulOE.js";
19
+ import "./chrome-DNssqQJs.js";
20
20
  import "./skills-DO7WNsVJ.js";
21
21
  import "./redact-DSOAcWMe.js";
22
22
  import "./errors-BEU7IHU6.js";
23
23
  import "./tokens-yWO1wD7Z.js";
24
24
  import "./thinking-DgjGxdSP.js";
25
25
  import { n as resolveSessionFilePath, s as resolveStorePath } from "./paths-BsT3BvfH.js";
26
- import "./manager-BHddoe4T.js";
26
+ import "./manager-NDn8AFhr.js";
27
27
  import "./github-copilot-token-dYUr1mDQ.js";
28
28
  import "./sqlite-D8iYC_CU.js";
29
29
  import "./markdown-tables-jQzXAsf3.js";
@@ -1,4 +1,4 @@
1
- import { $ as isExternalHookSession, $t as emitAgentEvent, A as resolveSessionDeliveryTarget, At as resolveInputFileLimits, B as normalizeOptionalSessionKey, Bt as countActiveDescendantRuns, Cn as CommandLane, Ct as DEFAULT_INPUT_IMAGE_MAX_BYTES, Dn as runWithModelFallback, Dt as extractFileContentFromSource, Et as DEFAULT_INPUT_TIMEOUT_MS, F as normalizeHttpWebhookUrl, G as buildDeliveryFromLegacyPayload, H as normalizePayloadToSystemText, Ht as initSubagentRegistry, Jt as readLatestAssistantReply, K as hasLegacyDeliveryHints, Kt as resolveAgentTimeoutMs, N as resetDirectoryCache, O as resolveOutboundSessionRoute, Ot as extractImageContentFromSource, Q as getHookType, Qt as clearAgentRunContext, R as inferLegacyName, S as createSymiTools, Sn as waitForActiveTasks, T as resolveAnnounceTargetFromKey, Tn as resolveModelProfile, Tt as DEFAULT_INPUT_MAX_REDIRECTS, U as normalizeRequiredName, Ut as listDescendantRunsForRequester, V as normalizeOptionalText, Vt as countActiveRunsForSession, W as migrateLegacyCronPayload, X as buildSafeExternalPrompt, Z as detectSuspiciousPatterns, a as getPluginToolMeta, an as getActiveEmbeddedRunCount, at as isGatewaySigusr1RestartExternallyAllowed, bn as resetAllLanes, c as handleSlackHttpRequest, cn as registerUnhandledRejectionHandler, ct as setGatewaySigusr1RestartPolicy, d as buildHistoryContextFromEntries, dn as formatUserTime, en as getAgentRunContext, fn as resolveUserTimeFormat, h as getTotalPendingReplies, it as emitGatewayRestart, k as resolveOutboundTarget, kt as normalizeMimeList, l as readJsonBodyWithLimit, ln as ToolInputError, lt as setPreRestartDeferralCheck, n as applyToolPolicyPipeline, nn as registerAgentRunContext, nt as consumeGatewaySigusr1RestartAuthorization, ot as markGatewaySigusr1RestartHandled, pn as resolveUserTimezone, q as stripLegacyDeliveryFields, qt as runSubagentAnnounceFlow, r as buildDefaultToolPolicyPipelineSteps, rt as deferGatewayRestartUntilIdle, s as loadSymiPlugins, t as runAgentTurn, tn as onAgentEvent, u as requestBodyErrorToText, vn as getActiveTaskCount, wn as classifyOutboundMessage, wt as DEFAULT_INPUT_IMAGE_MIMES, xn as setCommandLaneConcurrency, yn as getTotalQueueSize, z as normalizeOptionalAgentId } from "./unified-runner-4O0ifBsI.js";
1
+ import { $ as isExternalHookSession, $t as emitAgentEvent, A as resolveSessionDeliveryTarget, At as resolveInputFileLimits, B as normalizeOptionalSessionKey, Bt as countActiveDescendantRuns, Cn as CommandLane, Ct as DEFAULT_INPUT_IMAGE_MAX_BYTES, Dn as runWithModelFallback, Dt as extractFileContentFromSource, Et as DEFAULT_INPUT_TIMEOUT_MS, F as normalizeHttpWebhookUrl, G as buildDeliveryFromLegacyPayload, H as normalizePayloadToSystemText, Ht as initSubagentRegistry, Jt as readLatestAssistantReply, K as hasLegacyDeliveryHints, Kt as resolveAgentTimeoutMs, N as resetDirectoryCache, O as resolveOutboundSessionRoute, Ot as extractImageContentFromSource, Q as getHookType, Qt as clearAgentRunContext, R as inferLegacyName, S as createSymiTools, Sn as waitForActiveTasks, T as resolveAnnounceTargetFromKey, Tn as resolveModelProfile, Tt as DEFAULT_INPUT_MAX_REDIRECTS, U as normalizeRequiredName, Ut as listDescendantRunsForRequester, V as normalizeOptionalText, Vt as countActiveRunsForSession, W as migrateLegacyCronPayload, X as buildSafeExternalPrompt, Z as detectSuspiciousPatterns, a as getPluginToolMeta, an as getActiveEmbeddedRunCount, at as isGatewaySigusr1RestartExternallyAllowed, bn as resetAllLanes, c as handleSlackHttpRequest, cn as registerUnhandledRejectionHandler, ct as setGatewaySigusr1RestartPolicy, d as buildHistoryContextFromEntries, dn as formatUserTime, en as getAgentRunContext, fn as resolveUserTimeFormat, h as getTotalPendingReplies, it as emitGatewayRestart, k as resolveOutboundTarget, kt as normalizeMimeList, l as readJsonBodyWithLimit, ln as ToolInputError, lt as setPreRestartDeferralCheck, n as applyToolPolicyPipeline, nn as registerAgentRunContext, nt as consumeGatewaySigusr1RestartAuthorization, ot as markGatewaySigusr1RestartHandled, pn as resolveUserTimezone, q as stripLegacyDeliveryFields, qt as runSubagentAnnounceFlow, r as buildDefaultToolPolicyPipelineSteps, rt as deferGatewayRestartUntilIdle, s as loadSymiPlugins, t as runAgentTurn, tn as onAgentEvent, u as requestBodyErrorToText, vn as getActiveTaskCount, wn as classifyOutboundMessage, wt as DEFAULT_INPUT_IMAGE_MIMES, xn as setCommandLaneConcurrency, yn as getTotalQueueSize, z as normalizeOptionalAgentId } from "./unified-runner-CtSJoaGS.js";
2
2
  import { A as isRich, E as setVerbose, H as createInternalHookEvent, M as getChildLogger, N as getLogger, P as getResolvedLoggerSettings, U as registerInternalHook, V as clearInternalHooks, W as triggerInternalHook, j as theme, k as colorize, m as createEmptyPluginRegistry, r as DEFAULT_CHAT_CHANNEL } from "./registry-Sbac4a4z.js";
3
3
  import { _ as resolveStateDir, i as isNixMode, l as resolveGatewayLockDir, o as resolveConfigPath, r as STATE_DIR, t as CONFIG_PATH, u as resolveGatewayPort, v as expandHomePrefix } from "./paths-By0XjHBk.js";
4
4
  import { h as resolveUserPath, s as ensureDir, t as CONFIG_DIR, v as shortenHomePath, x as truncateUtf16Safe } from "./utils-CTPsqyE_.js";
@@ -58,8 +58,8 @@ import { c as hasNonzeroUsage, s as deriveSessionTotalTokens } from "./session-c
58
58
  import { C as enqueueSystemEvent, a as loadCombinedSessionStoreForGateway, f as formatRestartSentinelMessage, i as listSessionsFromStore, m as summarizeRestartSentinel, o as loadSessionEntry, u as consumeRestartSentinel, x as lookupContextTokens } from "./session-utils-Cs1jlD-q.js";
59
59
  import { r as getMachineDisplayName } from "./with-timeout-DPR4A2dx.js";
60
60
  import { a as resolveAgentIdentity } from "./reply-prefix-BFNeXT65.js";
61
- import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-BZ24UkLW.js";
62
- import { c as resolveMemorySearchConfig } from "./manager-Cw7IJGbB.js";
61
+ import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-DOl2l2AS.js";
62
+ import { c as resolveMemorySearchConfig } from "./manager-CL767Sv9.js";
63
63
  import "./sqlite-Cod7C5ba.js";
64
64
  import "./chunk-BxfKjCUx.js";
65
65
  import "./markdown-tables-CS1Tvb3z.js";
@@ -92,7 +92,7 @@ import { t as formatDocsLink } from "./links-Bqr0FxXx.js";
92
92
  import { n as runCommandWithRuntime } from "./cli-utils-CuyGL3rq.js";
93
93
  import { t as formatHelpExamples } from "./help-format-7hFcsqss.js";
94
94
  import { n as withProgress } from "./progress-swt2y17x.js";
95
- import "./memory-cli-0HHYm-B8.js";
95
+ import "./memory-cli-B9_Vfaow.js";
96
96
  import "./logging-BWknayJl.js";
97
97
  import "./replies-CbXXjn9X.js";
98
98
  import { a as resolveSubagentToolPolicy, i as resolveGroupToolPolicy, r as resolveEffectiveToolPolicy } from "./pi-tools.policy-H2t-Xkfc.js";
@@ -124,15 +124,15 @@ import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } fr
124
124
  import { i as toOptionString, n as extractGatewayMiskeys, r as maybeExplainGatewayServiceStop, t as describeUnknownError } from "./shared-1xPo9ygd.js";
125
125
  import { c as resolveNodeCommandAllowlist, l as probeGateway, n as DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "./audit-C_3fAFeS.js";
126
126
  import { t as discoverGatewayBeacons } from "./bonjour-discovery-CWTnBKX8.js";
127
- import { r as pickGatewaySelfPresence } from "./status-D7QX7VDk.js";
127
+ import { r as pickGatewaySelfPresence } from "./status-CCAO6ZHm.js";
128
128
  import { i as styleHealthChannelLine, n as getHealthSnapshot, t as formatHealthChannelLines } from "./health-7UqIGG8U.js";
129
129
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-CJQ97d4u.js";
130
130
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, m as normalizeUpdateChannel, n as compareSemverStrings, t as checkUpdateStatus } from "./update-check-BCL_K7kx.js";
131
- import { t as runOnboardingWizard } from "./onboarding-DxZAGVkD.js";
132
- import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-Bl41VzMu.js";
133
- import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-CyAPMMJC.js";
131
+ import { t as runOnboardingWizard } from "./onboarding-BG23DuS1.js";
132
+ import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-6-10RyMD.js";
133
+ import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-HQd5hCpM.js";
134
134
  import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-CGaQ7-Vb.js";
135
- import { a as getCliSessionId, o as setCliSessionId, s as runCliAgent, t as agentCommand } from "./agent-DxRVDqSg.js";
135
+ import { a as getCliSessionId, o as setCliSessionId, s as runCliAgent, t as agentCommand } from "./agent-BsRYHa15.js";
136
136
  import { t as createOutboundSendDeps } from "./outbound-send-deps--SpwgFhS.js";
137
137
  import { s as loadAgentIdentityFromWorkspace } from "./agents.config-B7sNDvhz.js";
138
138
  import "./dm-policy-shared-CeFt0nch.js";
@@ -12051,7 +12051,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
12051
12051
  });
12052
12052
  let glassUiBridgeCleanup = null;
12053
12053
  if (!minimalTestGateway) {
12054
- const { createGlassUiBridge } = await import("./glass-ui-ws-BJcI_IdV.js");
12054
+ const { createGlassUiBridge } = await import("./glass-ui-ws-CrmnRYxe.js");
12055
12055
  glassUiBridgeCleanup = createGlassUiBridge({
12056
12056
  wss: glassUiWss,
12057
12057
  context: gatewayRequestContext,
@@ -26,7 +26,7 @@ import "./pairing-token-B-OTYROz.js";
26
26
  import { t as safeEqualSecret } from "./secret-equal-CDUVxXmp.js";
27
27
  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-TZUXtwGR.js";
28
28
  import { n as pickPrimaryTailnetIPv4, r as pickPrimaryTailnetIPv6 } from "./tailnet-B2SPYrh4.js";
29
- import { $ as normalizeHttpWebhookUrl, $t as resolveInputFileLimits, Cn as emitAgentEvent, Ct as deferGatewayRestartUntilIdle, D as getActiveEmbeddedRunCount, En as registerAgentRunContext, Et as markGatewaySigusr1RestartHandled, F as createSymiTools, Gt as registerUnhandledRejectionHandler, H as resolveOutboundSessionRoute, Jt as DEFAULT_INPUT_MAX_REDIRECTS, Kt as DEFAULT_INPUT_IMAGE_MAX_BYTES, M as resolveModelProfile, Ot as setGatewaySigusr1RestartPolicy, Qt as normalizeMimeList, R as readLatestAssistantReply, S as getTotalPendingReplies, Sn as clearAgentRunContext, St as consumeGatewaySigusr1RestartAuthorization, T as runAgentTurn, Tn as onAgentEvent, Tt as isGatewaySigusr1RestartExternallyAllowed, U as resolveOutboundTarget, W as resolveSessionDeliveryTarget, Xt as extractFileContentFromSource, Y as runWithModelFallback, Yt as DEFAULT_INPUT_TIMEOUT_MS, Zt as extractImageContentFromSource, _ as requestBodyErrorToText, _n as getTotalQueueSize, _t as isExternalHookSession, at as normalizeOptionalText, bn as waitForActiveTasks, ct as migrateLegacyCronPayload, dn as formatUserTime, dt as stripLegacyDeliveryFields, f as getPluginToolMeta, fn as resolveUserTimeFormat, g as readJsonBodyWithLimit, gn as getActiveTaskCount, gt as getHookType, h as handleSlackHttpRequest, ht as detectSuspiciousPatterns, i as listDescendantRunsForRequester, it as normalizeOptionalSessionKey, j as classifyOutboundMessage, kt as setPreRestartDeferralCheck, l as applyToolPolicyPipeline, ln as ToolInputError, lt as buildDeliveryFromLegacyPayload, m as loadSymiPlugins, mt as buildSafeExternalPrompt, n as countActiveRunsForSession, nt as inferLegacyName, ot as normalizePayloadToSystemText, pn as resolveUserTimezone, q as resetDirectoryCache, qt as DEFAULT_INPUT_IMAGE_MIMES, r as initSubagentRegistry, rt as normalizeOptionalAgentId, s as runSubagentAnnounceFlow, st as normalizeRequiredName, t as countActiveDescendantRuns, tn as resolveAgentTimeoutMs, u as buildDefaultToolPolicyPipelineSteps, ut as hasLegacyDeliveryHints, v as buildHistoryContextFromEntries, vn as resetAllLanes, wn as getAgentRunContext, wt as emitGatewayRestart, xn as CommandLane, yn as setCommandLaneConcurrency, z as resolveAnnounceTargetFromKey } from "./subagent-registry-CVhLz4p3.js";
29
+ import { $ as normalizeHttpWebhookUrl, $t as resolveInputFileLimits, Cn as emitAgentEvent, Ct as deferGatewayRestartUntilIdle, D as getActiveEmbeddedRunCount, En as registerAgentRunContext, Et as markGatewaySigusr1RestartHandled, F as createSymiTools, Gt as registerUnhandledRejectionHandler, H as resolveOutboundSessionRoute, Jt as DEFAULT_INPUT_MAX_REDIRECTS, Kt as DEFAULT_INPUT_IMAGE_MAX_BYTES, M as resolveModelProfile, Ot as setGatewaySigusr1RestartPolicy, Qt as normalizeMimeList, R as readLatestAssistantReply, S as getTotalPendingReplies, Sn as clearAgentRunContext, St as consumeGatewaySigusr1RestartAuthorization, T as runAgentTurn, Tn as onAgentEvent, Tt as isGatewaySigusr1RestartExternallyAllowed, U as resolveOutboundTarget, W as resolveSessionDeliveryTarget, Xt as extractFileContentFromSource, Y as runWithModelFallback, Yt as DEFAULT_INPUT_TIMEOUT_MS, Zt as extractImageContentFromSource, _ as requestBodyErrorToText, _n as getTotalQueueSize, _t as isExternalHookSession, at as normalizeOptionalText, bn as waitForActiveTasks, ct as migrateLegacyCronPayload, dn as formatUserTime, dt as stripLegacyDeliveryFields, f as getPluginToolMeta, fn as resolveUserTimeFormat, g as readJsonBodyWithLimit, gn as getActiveTaskCount, gt as getHookType, h as handleSlackHttpRequest, ht as detectSuspiciousPatterns, i as listDescendantRunsForRequester, it as normalizeOptionalSessionKey, j as classifyOutboundMessage, kt as setPreRestartDeferralCheck, l as applyToolPolicyPipeline, ln as ToolInputError, lt as buildDeliveryFromLegacyPayload, m as loadSymiPlugins, mt as buildSafeExternalPrompt, n as countActiveRunsForSession, nt as inferLegacyName, ot as normalizePayloadToSystemText, pn as resolveUserTimezone, q as resetDirectoryCache, qt as DEFAULT_INPUT_IMAGE_MIMES, r as initSubagentRegistry, rt as normalizeOptionalAgentId, s as runSubagentAnnounceFlow, st as normalizeRequiredName, t as countActiveDescendantRuns, tn as resolveAgentTimeoutMs, u as buildDefaultToolPolicyPipelineSteps, ut as hasLegacyDeliveryHints, v as buildHistoryContextFromEntries, vn as resetAllLanes, wn as getAgentRunContext, wt as emitGatewayRestart, xn as CommandLane, yn as setCommandLaneConcurrency, z as resolveAnnounceTargetFromKey } from "./subagent-registry-D8BIWG9Q.js";
30
30
  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-Dn6VXn4p.js";
31
31
  import { n as listChannelPlugins, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-BsEhWvLn.js";
32
32
  import "./send-Dq252-bi.js";
@@ -56,8 +56,8 @@ import "./model-auth-Byr7Gic_.js";
56
56
  import "./github-copilot-token-B5y4__YM.js";
57
57
  import "./models-config-CiR_RUxw.js";
58
58
  import { a as resolveAgentIdentity } from "./reply-prefix-DV3KhOhL.js";
59
- import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-C02Znuee.js";
60
- import { c as resolveMemorySearchConfig } from "./manager-DH00nlW8.js";
59
+ import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-CTf9MdBg.js";
60
+ import { c as resolveMemorySearchConfig } from "./manager-XfNxjaX5.js";
61
61
  import "./sqlite-9jF_eajd.js";
62
62
  import "./chunk-B2lBXhR0.js";
63
63
  import "./markdown-tables-BEdkErjm.js";
@@ -90,7 +90,7 @@ import { t as formatDocsLink } from "./links-Dnmd-RS-.js";
90
90
  import { n as runCommandWithRuntime } from "./cli-utils-DXfA5936.js";
91
91
  import { t as formatHelpExamples } from "./help-format-Dbp8yEhl.js";
92
92
  import { n as withProgress } from "./progress-CI19Xh3z.js";
93
- import "./memory-cli-083UJtVJ.js";
93
+ import "./memory-cli-CA5PbH9y.js";
94
94
  import "./logging-UO6tk8Em.js";
95
95
  import "./replies-CLREUzzB.js";
96
96
  import { a as resolveSubagentToolPolicy, i as resolveGroupToolPolicy, r as resolveEffectiveToolPolicy } from "./pi-tools.policy-06k__URR.js";
@@ -117,17 +117,17 @@ import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } fr
117
117
  import { i as toOptionString, n as extractGatewayMiskeys, r as maybeExplainGatewayServiceStop, t as describeUnknownError } from "./shared-Dl4ZrOve.js";
118
118
  import { c as resolveNodeCommandAllowlist, l as probeGateway, n as DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "./audit-DyncRBKq.js";
119
119
  import { t as discoverGatewayBeacons } from "./bonjour-discovery-XbH0AYJ4.js";
120
- import { i as pickGatewaySelfPresence } from "./status-BEZotN01.js";
120
+ import { i as pickGatewaySelfPresence } from "./status-D_0593yR.js";
121
121
  import { a as styleHealthChannelLine, n as getHealthSnapshot, t as formatHealthChannelLines } from "./health-Dkwuq8ta.js";
122
122
  import { n as createDefaultDeps, t as createOutboundSendDeps } from "./outbound-send-deps-BCyarBRf.js";
123
123
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-Dnz69KRU.js";
124
124
  import { t as ensureSymiCliOnPath } from "./path-env-SUrcTSJ-.js";
125
125
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, m as normalizeUpdateChannel, n as compareSemverStrings, t as checkUpdateStatus } from "./update-check-DLOnLuop.js";
126
- import { t as runOnboardingWizard } from "./onboarding-CrCGoZ4H.js";
127
- import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-DTkVQH8Q.js";
128
- import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-HNg0rTkI.js";
126
+ import { t as runOnboardingWizard } from "./onboarding-MPSU9pXd.js";
127
+ import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-Bdz-OwQ4.js";
128
+ import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-D4iLNyBo.js";
129
129
  import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-BYBwPfuu.js";
130
- import { a as getCliSessionId, o as setCliSessionId, s as runCliAgent, t as agentCommand } from "./agent-CB5yb-7V.js";
130
+ import { a as getCliSessionId, o as setCliSessionId, s as runCliAgent, t as agentCommand } from "./agent-TRt_SsAW.js";
131
131
  import { s as loadAgentIdentityFromWorkspace } from "./agents.config-CqfMQEiy.js";
132
132
  import "./dm-policy-shared-BtrdvOIT.js";
133
133
  import "./node-service-CZlyWmxa.js";
@@ -12046,7 +12046,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
12046
12046
  });
12047
12047
  let glassUiBridgeCleanup = null;
12048
12048
  if (!minimalTestGateway) {
12049
- const { createGlassUiBridge } = await import("./glass-ui-ws-Z-W33_mF.js");
12049
+ const { createGlassUiBridge } = await import("./glass-ui-ws-BK5qk7-_.js");
12050
12050
  glassUiBridgeCleanup = createGlassUiBridge({
12051
12051
  wss: glassUiWss,
12052
12052
  context: gatewayRequestContext,
@@ -17,7 +17,7 @@ import "./client-BOd5o3Kp.js";
17
17
  import "./call-DTshgdlW.js";
18
18
  import "./message-channel-DXToSaWK.js";
19
19
  import "./pairing-token-B-OTYROz.js";
20
- import { M as resolveModelProfile } from "./subagent-registry-CVhLz4p3.js";
20
+ import { M as resolveModelProfile } from "./subagent-registry-D8BIWG9Q.js";
21
21
  import "./sessions-Dn6VXn4p.js";
22
22
  import "./plugins-BsEhWvLn.js";
23
23
  import "./send-Dq252-bi.js";
@@ -47,8 +47,8 @@ import "./model-auth-Byr7Gic_.js";
47
47
  import "./github-copilot-token-B5y4__YM.js";
48
48
  import "./models-config-CiR_RUxw.js";
49
49
  import "./reply-prefix-DV3KhOhL.js";
50
- import "./memory-C02Znuee.js";
51
- import "./manager-DH00nlW8.js";
50
+ import "./memory-CTf9MdBg.js";
51
+ import "./manager-XfNxjaX5.js";
52
52
  import "./sqlite-9jF_eajd.js";
53
53
  import "./chunk-B2lBXhR0.js";
54
54
  import "./markdown-tables-BEdkErjm.js";
@@ -79,7 +79,7 @@ import "./links-Dnmd-RS-.js";
79
79
  import "./cli-utils-DXfA5936.js";
80
80
  import "./help-format-Dbp8yEhl.js";
81
81
  import "./progress-CI19Xh3z.js";
82
- import "./memory-cli-083UJtVJ.js";
82
+ import "./memory-cli-CA5PbH9y.js";
83
83
  import "./logging-UO6tk8Em.js";
84
84
  import "./replies-CLREUzzB.js";
85
85
  import "./pi-tools.policy-06k__URR.js";
@@ -95,14 +95,14 @@ import "./service-DYpU1ajf.js";
95
95
  import "./diagnostics-D2oNwzue.js";
96
96
  import "./table-D0JXlEhQ.js";
97
97
  import "./audit-DyncRBKq.js";
98
- import "./status-BEZotN01.js";
98
+ import "./status-D_0593yR.js";
99
99
  import "./health-Dkwuq8ta.js";
100
100
  import "./outbound-send-deps-BCyarBRf.js";
101
101
  import "./control-ui-assets-Dnz69KRU.js";
102
102
  import "./update-check-DLOnLuop.js";
103
- import { n as handleGatewayRequest } from "./server-methods-DTkVQH8Q.js";
104
- import "./push-apns-HNg0rTkI.js";
105
- import "./agent-CB5yb-7V.js";
103
+ import { n as handleGatewayRequest } from "./server-methods-Bdz-OwQ4.js";
104
+ import "./push-apns-D4iLNyBo.js";
105
+ import "./agent-TRt_SsAW.js";
106
106
  import "./agents.config-CqfMQEiy.js";
107
107
  import "./dm-policy-shared-BtrdvOIT.js";
108
108
  import "./node-service-CZlyWmxa.js";