@symerian/symi 3.5.27 → 3.5.29

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 (114) 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 +4 -4
  9. package/dist/bundled/session-memory/handler.js +4 -4
  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-OTJg3QKn.js → chrome-CmQwGAuL.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 +145 -7
  26. package/dist/control-ui/index.html +14 -0
  27. package/dist/control-ui/js/symframe-bidirectional.js +210 -0
  28. package/dist/{deliver-BiWlR84Y.js → deliver-B04yNX82.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 +2 -2
  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 +4 -4
  41. package/dist/{manager-Cw7IJGbB.js → manager-CL767Sv9.js} +1 -1
  42. package/dist/{manager-DbVMwpDc.js → manager-DM2oPS8M.js} +1 -1
  43. package/dist/{manager-BHddoe4T.js → manager-DogrTmEo.js} +1 -1
  44. package/dist/{manager-DH00nlW8.js → manager-XfNxjaX5.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-DdoLFoXg.js} +4 -3
  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/plugin-sdk/index.js +6 -6
  64. package/dist/{plugins-cli-Cmf3kRf5.js → plugins-cli-8Jo1X8SU.js} +5 -5
  65. package/dist/{plugins-cli-CqV1Q7ao.js → plugins-cli-Dl7-FSCq.js} +5 -5
  66. package/dist/{program-CGuYYumL.js → program-D-LYHEvk.js} +10 -10
  67. package/dist/{program-context-B0ovpbFU.js → program-context-BpeLcVUB.js} +18 -18
  68. package/dist/{prompt-select-styled-B5GrNfqR.js → prompt-select-styled-Ceih9wkY.js} +4 -4
  69. package/dist/{prompt-select-styled-b752FPLG.js → prompt-select-styled-ZWxB2Odf.js} +4 -4
  70. package/dist/{provider-auth-helpers-DU8RlQz7.js → provider-auth-helpers-BCejcf5o.js} +1 -1
  71. package/dist/{provider-auth-helpers-BKveYcEH.js → provider-auth-helpers-BdvW7eau.js} +1 -1
  72. package/dist/{push-apns-HNg0rTkI.js → push-apns-D4iLNyBo.js} +1 -1
  73. package/dist/{push-apns-CyAPMMJC.js → push-apns-HQd5hCpM.js} +1 -1
  74. package/dist/{pw-ai-DY_6l11g.js → pw-ai-DLsdzdgc.js} +1 -1
  75. package/dist/{register.agent-DbPYGG3u.js → register.agent-DoUbqZIu.js} +9 -9
  76. package/dist/{register.agent-BKbQhrre.js → register.agent-zwVEiCHs.js} +8 -8
  77. package/dist/{register.configure-C4_ShaQV.js → register.configure-CSe8Rlda.js} +8 -8
  78. package/dist/{register.configure-B0M15y31.js → register.configure-jBKvvOnk.js} +8 -8
  79. package/dist/{register.maintenance-bzLNOqch.js → register.maintenance-BdikNAV1.js} +9 -9
  80. package/dist/{register.maintenance-BOYWTu9C.js → register.maintenance-royLmVA2.js} +8 -8
  81. package/dist/{register.message-Bfukmte_.js → register.message-C1H5Vcnb.js} +5 -5
  82. package/dist/{register.message-BtCthbpo.js → register.message-C_0uLdYn.js} +5 -5
  83. package/dist/{register.onboard-D5GmuX8K.js → register.onboard-DTLtb0SN.js} +2 -2
  84. package/dist/{register.onboard-CDsSVoFI.js → register.onboard-DnMRUtnl.js} +2 -2
  85. package/dist/{register.setup-Bp8rYeRx.js → register.setup-B9sjRH7l.js} +2 -2
  86. package/dist/{register.setup-DzospfSf.js → register.setup-KA8Cs3HJ.js} +2 -2
  87. package/dist/{register.status-health-sessions-NVbWTQpZ.js → register.status-health-sessions-B_jcsH3c.js} +3 -3
  88. package/dist/{register.status-health-sessions-DE2db_Uo.js → register.status-health-sessions-BwiKHLEj.js} +3 -3
  89. package/dist/{register.subclis-QXO75pUm.js → register.subclis-B_V8vNI0.js} +9 -9
  90. package/dist/{run-main-MD8Z8ydF.js → run-main-DhgQtxI0.js} +17 -17
  91. package/dist/{server-methods-Bl41VzMu.js → server-methods-6-10RyMD.js} +7 -7
  92. package/dist/{server-methods-DTkVQH8Q.js → server-methods-Bdz-OwQ4.js} +7 -7
  93. package/dist/{server-node-events-C0smPxrR.js → server-node-events-B3Yey3h9.js} +6 -6
  94. package/dist/{server-node-events-CxYKzrbU.js → server-node-events-C4giIb7q.js} +6 -6
  95. package/dist/{status-DrWy5OkC.js → status-BRUIJsUm.js} +1 -1
  96. package/dist/{status-OTYFx93W.js → status-B_CQpjQ9.js} +1 -1
  97. package/dist/{status-D7QX7VDk.js → status-CCAO6ZHm.js} +1 -1
  98. package/dist/{status-BEZotN01.js → status-D_0593yR.js} +1 -1
  99. package/dist/{subagent-registry-CVhLz4p3.js → subagent-registry-D8BIWG9Q.js} +4 -3
  100. package/dist/{synthesis-CO5pr92g.js → synthesis-Bfhs-a4F.js} +4 -4
  101. package/dist/{synthesis-ts2nG0tK.js → synthesis-CV94EuT_.js} +4 -4
  102. package/dist/{synthesis-C1mZnGqD.js → synthesis-Cggd0_wq.js} +2 -2
  103. package/dist/{synthesis-RhT991Ni.js → synthesis-qvteT0Ti.js} +4 -4
  104. package/dist/{unified-runner-O3qR5Iie.js → unified-runner-C7BRCFJF.js} +11 -10
  105. package/dist/{unified-runner-4O0ifBsI.js → unified-runner-CtSJoaGS.js} +4 -3
  106. package/dist/{update-cli-BMURsYJU.js → update-cli-BrryYmFA.js} +8 -8
  107. package/dist/{update-cli-D9g9s187.js → update-cli-CUos9qgT.js} +9 -9
  108. package/extensions/memory-core/package.json +1 -1
  109. package/extensions/msteams/CHANGELOG.md +12 -0
  110. package/extensions/msteams/package.json +1 -1
  111. package/extensions/open-prose/package.json +1 -1
  112. package/extensions/outlook/package.json +1 -1
  113. package/extensions/slack/package.json +1 -1
  114. 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. */
@@ -996,24 +1111,40 @@ body {
996
1111
  them, so we use a generic "the card whose id matches" pattern via
997
1112
  :has() (when supported) plus a fallback class added by JS. */
998
1113
  .symframe[data-mode="focus"] .symframe-card-focused {
1114
+ /* Stage D.2: dropped `transform: scale(1.02)` — the scaled render
1115
+ area extends beyond the card's layout box and can leak past the
1116
+ cards container's overflow boundary. The halo + cyan border are
1117
+ plenty of focus signal on their own. */
999
1118
  opacity: 1 !important;
1000
1119
  box-shadow:
1001
1120
  0 0 24px rgba(0, 212, 255, 0.35),
1002
1121
  inset 0 1px 0 rgba(255, 255, 255, 0.06),
1003
1122
  0 4px 12px rgba(0, 0, 0, 0.25);
1004
1123
  border-color: var(--accent-cyan) !important;
1005
- transform: scale(1.02);
1006
- transform-origin: center;
1007
1124
  transition:
1008
1125
  box-shadow 0.4s ease,
1009
- border-color 0.4s ease,
1010
- transform 0.4s ease;
1126
+ border-color 0.4s ease;
1011
1127
  }
1012
1128
 
1013
1129
  /* Awaiting mode: footer dominant; cards collapse to title strips;
1014
- substrate dims to a status band. */
1130
+ substrate dims to a status band.
1131
+
1132
+ Stage D.2 fix (3.5.29): the original Stage D rules removed
1133
+ max-height on .symframe-awaiting and .awaiting-list to let the
1134
+ footer dominate — but with `display: flex; flex-direction: column`
1135
+ on .symframe-awaiting, the internal flex children (header / list /
1136
+ button) couldn't size correctly: the list had no flex-grow so it
1137
+ stayed at intrinsic content size, and the footer grew past its
1138
+ grid cell when the list was long. The list's content overflowed
1139
+ the column via the cascade.
1140
+
1141
+ The fix: keep .symframe-awaiting capped at 80% of the column
1142
+ (was max-height: 40% in Stage C.4 — bumped for the awaiting mode
1143
+ posture), and turn .awaiting-list into a flex: 1 0 0 child that
1144
+ scrolls internally when its content exceeds the now-larger footer.
1145
+ */
1015
1146
  .symframe[data-mode="awaiting"] {
1016
- grid-template-rows: auto minmax(60px, 1fr) 4fr;
1147
+ grid-template-rows: auto minmax(60px, 1fr) auto;
1017
1148
  }
1018
1149
  .symframe[data-mode="awaiting"] .symframe-substrate {
1019
1150
  opacity: 0.35;
@@ -1030,13 +1161,20 @@ body {
1030
1161
  display: none;
1031
1162
  }
1032
1163
  .symframe[data-mode="awaiting"] .symframe-awaiting {
1033
- max-height: none;
1164
+ /* Bump from C.4's 40% baseline cap to 80% so the footer can be
1165
+ "dominant" without exceeding the column. The `overflow: hidden`
1166
+ from C.4 still clips any overflow from misbehaving children. */
1167
+ max-height: 80%;
1034
1168
  background: rgba(0, 212, 255, 0.04);
1035
1169
  border-radius: 10px;
1036
1170
  margin-top: 8px;
1037
1171
  }
1038
1172
  .symframe[data-mode="awaiting"] .awaiting-list {
1173
+ /* The footer is now sized larger than baseline. Let the list flex
1174
+ to fill it AND scroll internally if items exceed the cell. */
1039
1175
  max-height: none;
1176
+ flex: 1 1 0;
1177
+ min-height: 0;
1040
1178
  }
1041
1179
 
1042
1180
  /* Quiet mode: only the substrate breathes. Cards + AWAITING hidden.
@@ -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 { t as formatCliCommand } from "./command-format-BrrHNE8r.js";
9
9
  import { n as isPidAlive, t as resolveProcessScopedMap } from "./process-scoped-map-B-dHc_9I.js";
10
10
  import { c as loadConfig, d as writeConfigFile, m as parseByteSize, p as parseDurationMs, s as createConfigIO, t as SsrFBlockedError } from "./ssrf-DNhyFMRW.js";
11
11
  import { t as parseBooleanValue } from "./boolean-BsqeuxE6.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-OTJg3QKn.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-CmQwGAuL.js";
13
13
  import { a as syncSkillsToWorkspace, l as resolveSandboxInputPath, m as sanitizeEnvVars, u as resolveSandboxPath } from "./skills-Dm4gX4Tl.js";
14
14
  import { n as formatErrorMessage, t as extractErrorCode } from "./errors-C89ppfp9.js";
15
15
  import { b as SafeOpenError, d as extensionForMime, i as buildImageResizeSideGrid, l as resizeToJpeg, o as getImageMetadata, r as IMAGE_REDUCE_QUALITY_STEPS, t as getAgentScopedMediaLocalRoots, u as detectMime, x as openFileWithinRoot } from "./local-roots-C7fBKoOI.js";
@@ -939,7 +939,7 @@ function isModuleNotFoundError(err) {
939
939
  }
940
940
  async function loadPwAiModule(mode) {
941
941
  try {
942
- return await import("./pw-ai-DY_6l11g.js");
942
+ return await import("./pw-ai-DLsdzdgc.js");
943
943
  } catch (err) {
944
944
  if (mode === "soft") return null;
945
945
  if (isModuleNotFoundError(err)) return null;
@@ -3536,11 +3536,11 @@ function createProfileContext(opts, profile) {
3536
3536
  const userDataDir = resolveSymiUserDataDir(profile.name);
3537
3537
  const profileState = getProfileState();
3538
3538
  if (await isHttpReachable(300) && !profileState.running) try {
3539
- await (await import("./pw-ai-DY_6l11g.js")).closePlaywrightBrowserConnection();
3539
+ await (await import("./pw-ai-DLsdzdgc.js")).closePlaywrightBrowserConnection();
3540
3540
  } catch {}
3541
3541
  if (profileState.running) await stopRunningBrowser();
3542
3542
  try {
3543
- await (await import("./pw-ai-DY_6l11g.js")).closePlaywrightBrowserConnection();
3543
+ await (await import("./pw-ai-DLsdzdgc.js")).closePlaywrightBrowserConnection();
3544
3544
  } catch {}
3545
3545
  if (!fs.existsSync(userDataDir)) return {
3546
3546
  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,7 +6,7 @@ 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";
9
+ import { a as resolveAgentTimeoutMs, r as runEmbeddedPiAgent } from "./pi-embedded-DdoLFoXg.js";
10
10
  import { $ as loadSessionStore, nt as saveSessionStore } from "./deliver-f3cIWxXT.js";
11
11
  import "./diagnostic-BdRnGknC.js";
12
12
  import "./diagnostic-session-state-DpxCUzoM.js";
@@ -23,7 +23,7 @@ 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-DogrTmEo.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,