@symerian/symi 2.0.11 → 2.0.13

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.
@@ -14,10 +14,10 @@ import "./model-auth-CeL58m55.js";
14
14
  import "./github-copilot-token-C_qUP7p5.js";
15
15
  import "./pi-model-discovery-DaNAekda.js";
16
16
  import "./message-channel-Dz5lr5b0.js";
17
- import "./pi-embedded-helpers-kB5lBgXk.js";
17
+ import "./pi-embedded-helpers-x8rJur4F.js";
18
18
  import "./config-DM0K7qC1.js";
19
19
  import "./manifest-registry-D0IQ3WuX.js";
20
- import "./chrome-LmEyZdbC.js";
20
+ import "./chrome-BATLK3yK.js";
21
21
  import "./frontmatter-C_bv_0P8.js";
22
22
  import "./skills-BFekKL7i.js";
23
23
  import "./redact-jSxx6Ep2.js";
@@ -28,10 +28,10 @@ import "./thinking-CdlENGRW.js";
28
28
  import "./accounts-qtxJ-6em.js";
29
29
  import "./paths-DLyHUt31.js";
30
30
  import "./tool-images-DXB7tqWi.js";
31
- import "./image-RFofsrof.js";
31
+ import "./image-RLbZ3RUn.js";
32
32
  import "./gemini-auth-7AWT6JXV.js";
33
33
  import "./local-roots-DMwIh5cS.js";
34
- import { a as resolveMediaAttachmentLocalRoots, n as createMediaAttachmentCache, o as runCapability, r as normalizeMediaAttachments, t as buildProviderRegistry, u as isAudioAttachment } from "./runner-DOvsNiYz.js";
34
+ import { a as resolveMediaAttachmentLocalRoots, n as createMediaAttachmentCache, o as runCapability, r as normalizeMediaAttachments, t as buildProviderRegistry, u as isAudioAttachment } from "./runner-DjHRFXSI.js";
35
35
 
36
36
  //#region src/media-understanding/audio-preflight.ts
37
37
  /**
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.0.11",
3
- "commit": "85e719510facef016f5cad9e80f69283c32f80d2",
4
- "builtAt": "2026-03-09T01:18:01.878Z"
2
+ "version": "2.0.13",
3
+ "commit": "32c25eda6de685297dbe27f863f49b079ed0dff0",
4
+ "builtAt": "2026-03-09T17:00:11.257Z"
5
5
  }
@@ -5,7 +5,7 @@ import { s as resolveAgentWorkspaceDir, t as listAgentIds } from "../../agent-sc
5
5
  import { r as defaultRuntime, t as createSubsystemLogger } from "../../subsystem-Bs9YvKLa.js";
6
6
  import "../../workspace-wAaHI8-5.js";
7
7
  import { n as SILENT_REPLY_TOKEN } from "../../tokens-H1H1LiSQ.js";
8
- import { a as createDefaultDeps, i as agentCommand } from "../../pi-embedded-BjzaB3CT.js";
8
+ import { a as createDefaultDeps, i as agentCommand } from "../../pi-embedded-ZzUH4ioO.js";
9
9
  import "../../plugins-DQYI3Fr-.js";
10
10
  import "../../accounts-tNElYrCH.js";
11
11
  import "../../boolean-B8-BqKGQ.js";
@@ -13,7 +13,7 @@ import "../../command-format-BaxDnULz.js";
13
13
  import "../../bindings-B7Ke6LJi.js";
14
14
  import "../../send-CHOArYFe.js";
15
15
  import "../../send-D3M6pMr5.js";
16
- import "../../deliver-B3UoBZdC.js";
16
+ import "../../deliver-DD3gs9SF.js";
17
17
  import "../../diagnostic-CI0kRQkt.js";
18
18
  import "../../diagnostic-session-state-Bxo4UHOL.js";
19
19
  import "../../accounts-CWktKM8a.js";
@@ -23,10 +23,10 @@ import "../../model-auth-CeL58m55.js";
23
23
  import "../../github-copilot-token-C_qUP7p5.js";
24
24
  import "../../pi-model-discovery-DaNAekda.js";
25
25
  import "../../message-channel-Dz5lr5b0.js";
26
- import { H as loadSessionStore, K as updateSessionStore, xt as resolveMainSessionKey, yt as resolveAgentMainSessionKey } from "../../pi-embedded-helpers-kB5lBgXk.js";
26
+ import { H as loadSessionStore, K as updateSessionStore, xt as resolveMainSessionKey, yt as resolveAgentMainSessionKey } from "../../pi-embedded-helpers-x8rJur4F.js";
27
27
  import "../../config-DM0K7qC1.js";
28
28
  import "../../manifest-registry-D0IQ3WuX.js";
29
- import "../../chrome-LmEyZdbC.js";
29
+ import "../../chrome-BATLK3yK.js";
30
30
  import "../../frontmatter-C_bv_0P8.js";
31
31
  import "../../skills-BFekKL7i.js";
32
32
  import "../../redact-jSxx6Ep2.js";
@@ -37,7 +37,7 @@ import "../../thinking-CdlENGRW.js";
37
37
  import "../../accounts-qtxJ-6em.js";
38
38
  import { s as resolveStorePath } from "../../paths-DLyHUt31.js";
39
39
  import "../../tool-images-DXB7tqWi.js";
40
- import "../../image-RFofsrof.js";
40
+ import "../../image-RLbZ3RUn.js";
41
41
  import "../../reply-prefix-XlyuyChD.js";
42
42
  import "../../manager-B5EXdBQV.js";
43
43
  import "../../gemini-auth-7AWT6JXV.js";
@@ -51,7 +51,7 @@ import "../../ir-DccrnjsE.js";
51
51
  import "../../render-CDCvpfhh.js";
52
52
  import "../../commands-registry-C3C4Rv3O.js";
53
53
  import "../../skill-commands-B64uavY9.js";
54
- import "../../runner-DOvsNiYz.js";
54
+ import "../../runner-DjHRFXSI.js";
55
55
  import "../../fetch-Bso4i15F.js";
56
56
  import "../../channel-activity-CsM_hJ_s.js";
57
57
  import "../../tables-DuZspiBu.js";
@@ -5,7 +5,7 @@ import { s as resolveAgentWorkspaceDir } from "../../agent-scope-BxoUQqgM.js";
5
5
  import { t as createSubsystemLogger } from "../../subsystem-Bs9YvKLa.js";
6
6
  import "../../workspace-wAaHI8-5.js";
7
7
  import "../../tokens-H1H1LiSQ.js";
8
- import "../../pi-embedded-BjzaB3CT.js";
8
+ import "../../pi-embedded-ZzUH4ioO.js";
9
9
  import "../../plugins-DQYI3Fr-.js";
10
10
  import "../../accounts-tNElYrCH.js";
11
11
  import "../../boolean-B8-BqKGQ.js";
@@ -13,7 +13,7 @@ import "../../command-format-BaxDnULz.js";
13
13
  import "../../bindings-B7Ke6LJi.js";
14
14
  import "../../send-CHOArYFe.js";
15
15
  import "../../send-D3M6pMr5.js";
16
- import "../../deliver-B3UoBZdC.js";
16
+ import "../../deliver-DD3gs9SF.js";
17
17
  import "../../diagnostic-CI0kRQkt.js";
18
18
  import "../../diagnostic-session-state-Bxo4UHOL.js";
19
19
  import "../../accounts-CWktKM8a.js";
@@ -23,10 +23,10 @@ import "../../model-auth-CeL58m55.js";
23
23
  import "../../github-copilot-token-C_qUP7p5.js";
24
24
  import "../../pi-model-discovery-DaNAekda.js";
25
25
  import "../../message-channel-Dz5lr5b0.js";
26
- import { ct as hasInterSessionUserProvenance } from "../../pi-embedded-helpers-kB5lBgXk.js";
26
+ import { ct as hasInterSessionUserProvenance } from "../../pi-embedded-helpers-x8rJur4F.js";
27
27
  import "../../config-DM0K7qC1.js";
28
28
  import "../../manifest-registry-D0IQ3WuX.js";
29
- import "../../chrome-LmEyZdbC.js";
29
+ import "../../chrome-BATLK3yK.js";
30
30
  import "../../frontmatter-C_bv_0P8.js";
31
31
  import "../../skills-BFekKL7i.js";
32
32
  import "../../redact-jSxx6Ep2.js";
@@ -37,7 +37,7 @@ import "../../thinking-CdlENGRW.js";
37
37
  import "../../accounts-qtxJ-6em.js";
38
38
  import "../../paths-DLyHUt31.js";
39
39
  import "../../tool-images-DXB7tqWi.js";
40
- import "../../image-RFofsrof.js";
40
+ import "../../image-RLbZ3RUn.js";
41
41
  import "../../reply-prefix-XlyuyChD.js";
42
42
  import "../../manager-B5EXdBQV.js";
43
43
  import "../../gemini-auth-7AWT6JXV.js";
@@ -51,7 +51,7 @@ import "../../ir-DccrnjsE.js";
51
51
  import "../../render-CDCvpfhh.js";
52
52
  import "../../commands-registry-C3C4Rv3O.js";
53
53
  import "../../skill-commands-B64uavY9.js";
54
- import "../../runner-DOvsNiYz.js";
54
+ import "../../runner-DjHRFXSI.js";
55
55
  import "../../fetch-Bso4i15F.js";
56
56
  import "../../channel-activity-CsM_hJ_s.js";
57
57
  import "../../tables-DuZspiBu.js";
@@ -1 +1 @@
1
- 6b89364bf417821d4d47b4f33bb302c36f8e572f78ad00ab14d61f95abefd0d8
1
+ 672cb3c8c92589ea6ad8d66e7e37a211d844d784fc6c1b6f14fbb6200cd487d7
@@ -10,7 +10,7 @@ import fs$1 from "node:fs";
10
10
  import { execFileSync, spawn } from "node:child_process";
11
11
  import net from "node:net";
12
12
  import { createServer } from "node:http";
13
- import WebSocket, { WebSocketServer } from "ws";
13
+ import WebSocket$1, { WebSocketServer } from "ws";
14
14
  import { Buffer as Buffer$1 } from "node:buffer";
15
15
 
16
16
  //#region src/browser/constants.ts
@@ -178,7 +178,7 @@ async function ensureChromeExtensionRelayServer(opts) {
178
178
  let nextExtensionId = 1;
179
179
  const sendToExtension = async (payload) => {
180
180
  const ws = extensionWs;
181
- if (!ws || ws.readyState !== WebSocket.OPEN) throw new Error("Chrome extension not connected");
181
+ if (!ws || ws.readyState !== WebSocket$1.OPEN) throw new Error("Chrome extension not connected");
182
182
  ws.send(JSON.stringify(payload));
183
183
  return await new Promise((resolve, reject) => {
184
184
  const timer = setTimeout(() => {
@@ -195,12 +195,12 @@ async function ensureChromeExtensionRelayServer(opts) {
195
195
  const broadcastToCdpClients = (evt) => {
196
196
  const msg = JSON.stringify(evt);
197
197
  for (const ws of cdpClients) {
198
- if (ws.readyState !== WebSocket.OPEN) continue;
198
+ if (ws.readyState !== WebSocket$1.OPEN) continue;
199
199
  ws.send(msg);
200
200
  }
201
201
  };
202
202
  const sendResponseToCdp = (ws, res) => {
203
- if (ws.readyState !== WebSocket.OPEN) return;
203
+ if (ws.readyState !== WebSocket$1.OPEN) return;
204
204
  ws.send(JSON.stringify(res));
205
205
  };
206
206
  const ensureTargetEventsForClient = (ws, mode) => {
@@ -425,7 +425,7 @@ async function ensureChromeExtensionRelayServer(opts) {
425
425
  wssExtension.on("connection", (ws) => {
426
426
  extensionWs = ws;
427
427
  const ping = setInterval(() => {
428
- if (ws.readyState !== WebSocket.OPEN) return;
428
+ if (ws.readyState !== WebSocket$1.OPEN) return;
429
429
  ws.send(JSON.stringify({ method: "ping" }));
430
430
  }, 5e3);
431
431
  ws.on("message", (data) => {
@@ -743,7 +743,7 @@ async function fetchOk(url, timeoutMs = 1500, init) {
743
743
  }
744
744
  async function withCdpSocket(wsUrl, fn, opts) {
745
745
  const headers = getHeadersWithAuth(wsUrl, opts?.headers ?? {});
746
- const ws = new WebSocket(wsUrl, {
746
+ const ws = new WebSocket$1(wsUrl, {
747
747
  handshakeTimeout: typeof opts?.handshakeTimeoutMs === "number" && Number.isFinite(opts.handshakeTimeoutMs) ? Math.max(1, Math.floor(opts.handshakeTimeoutMs)) : 5e3,
748
748
  ...Object.keys(headers).length ? { headers } : {}
749
749
  });
@@ -1637,7 +1637,7 @@ async function getChromeWebSocketUrl(cdpUrl, timeoutMs = 500) {
1637
1637
  async function canOpenWebSocket(wsUrl, timeoutMs = 800) {
1638
1638
  return await new Promise((resolve) => {
1639
1639
  const headers = getHeadersWithAuth(wsUrl);
1640
- const ws = new WebSocket(wsUrl, {
1640
+ const ws = new WebSocket$1(wsUrl, {
1641
1641
  handshakeTimeout: timeoutMs,
1642
1642
  ...Object.keys(headers).length ? { headers } : {}
1643
1643
  });
@@ -3513,3 +3513,202 @@ html, body {
3513
3513
  background: rgba(52, 211, 153, 0.25);
3514
3514
  border-color: rgba(52, 211, 153, 0.5);
3515
3515
  }
3516
+
3517
+ /* ── Reasoning Panel ───────────────────────────────────────────────── */
3518
+ .reasoning-panel {
3519
+ display: flex;
3520
+ flex-direction: column;
3521
+ min-height: 120px;
3522
+ max-height: 420px;
3523
+ flex-shrink: 0;
3524
+ }
3525
+
3526
+ .reasoning-live-dot {
3527
+ display: inline-block;
3528
+ width: 6px;
3529
+ height: 6px;
3530
+ border-radius: 50%;
3531
+ background: var(--accent-cyan);
3532
+ margin-left: 6px;
3533
+ vertical-align: middle;
3534
+ opacity: 0;
3535
+ transition: opacity 0.3s ease;
3536
+ }
3537
+ .reasoning-live-dot.active {
3538
+ opacity: 1;
3539
+ animation: pulse 1.2s ease-in-out infinite;
3540
+ }
3541
+
3542
+ .reasoning-feed {
3543
+ flex: 1;
3544
+ overflow-y: auto;
3545
+ scrollbar-width: thin;
3546
+ scrollbar-color: rgba(0, 212, 255, 0.2) transparent;
3547
+ display: flex;
3548
+ flex-direction: column;
3549
+ gap: 6px;
3550
+ padding-right: 2px;
3551
+ }
3552
+ .reasoning-feed::-webkit-scrollbar { width: 3px; }
3553
+ .reasoning-feed::-webkit-scrollbar-track { background: transparent; }
3554
+ .reasoning-feed::-webkit-scrollbar-thumb { background: rgba(0, 212, 255, 0.2); border-radius: 2px; }
3555
+
3556
+ /* Empty state */
3557
+ .reasoning-empty {
3558
+ display: flex;
3559
+ flex-direction: column;
3560
+ align-items: center;
3561
+ justify-content: center;
3562
+ gap: 8px;
3563
+ padding: 20px 0 12px;
3564
+ color: var(--text-dim);
3565
+ }
3566
+ .reasoning-empty-icon {
3567
+ width: 28px;
3568
+ height: 28px;
3569
+ opacity: 0.4;
3570
+ }
3571
+ .reasoning-empty-icon svg {
3572
+ width: 100%;
3573
+ height: 100%;
3574
+ }
3575
+ .reasoning-empty-text {
3576
+ font-size: 11px;
3577
+ font-family: var(--font-mono);
3578
+ opacity: 0.5;
3579
+ text-align: center;
3580
+ }
3581
+
3582
+ /* Run separator */
3583
+ .reasoning-run-sep {
3584
+ display: flex;
3585
+ align-items: center;
3586
+ gap: 8px;
3587
+ margin: 4px 0 2px;
3588
+ }
3589
+ .reasoning-run-sep::before,
3590
+ .reasoning-run-sep::after {
3591
+ content: '';
3592
+ flex: 1;
3593
+ height: 1px;
3594
+ background: rgba(255, 255, 255, 0.06);
3595
+ }
3596
+ .reasoning-run-sep-label {
3597
+ font-size: 9px;
3598
+ font-family: var(--font-mono);
3599
+ font-weight: 600;
3600
+ letter-spacing: 0.1em;
3601
+ color: var(--text-dim);
3602
+ white-space: nowrap;
3603
+ }
3604
+
3605
+ /* Individual reasoning entry */
3606
+ .reasoning-entry {
3607
+ display: flex;
3608
+ flex-direction: column;
3609
+ gap: 4px;
3610
+ padding: 6px 8px;
3611
+ background: rgba(255, 255, 255, 0.02);
3612
+ border: 1px solid rgba(255, 255, 255, 0.05);
3613
+ border-radius: 8px;
3614
+ transition: border-color 0.2s;
3615
+ }
3616
+ .reasoning-entry:hover {
3617
+ border-color: rgba(255, 255, 255, 0.09);
3618
+ }
3619
+
3620
+ /* Entry header row: badge + label */
3621
+ .reasoning-entry-header {
3622
+ display: flex;
3623
+ align-items: center;
3624
+ gap: 6px;
3625
+ }
3626
+ .reasoning-entry-badge {
3627
+ font-size: 9px;
3628
+ font-family: var(--font-mono);
3629
+ font-weight: 700;
3630
+ letter-spacing: 0.1em;
3631
+ padding: 1px 5px;
3632
+ border-radius: 4px;
3633
+ flex-shrink: 0;
3634
+ }
3635
+ /* Thinking badge — cyan tint */
3636
+ .reasoning-entry-badge.badge-think {
3637
+ background: rgba(0, 212, 255, 0.1);
3638
+ color: var(--accent-cyan);
3639
+ border: 1px solid rgba(0, 212, 255, 0.18);
3640
+ }
3641
+ /* Tool call badge — purple tint */
3642
+ .reasoning-entry-badge.badge-tool {
3643
+ background: rgba(139, 92, 246, 0.12);
3644
+ color: var(--accent-purple);
3645
+ border: 1px solid rgba(139, 92, 246, 0.2);
3646
+ }
3647
+ /* Tool result badge — green tint */
3648
+ .reasoning-entry-badge.badge-result {
3649
+ background: rgba(52, 211, 153, 0.1);
3650
+ color: var(--accent-green);
3651
+ border: 1px solid rgba(52, 211, 153, 0.18);
3652
+ }
3653
+
3654
+ .reasoning-entry-name {
3655
+ font-size: 11px;
3656
+ font-family: var(--font-mono);
3657
+ color: var(--text-muted);
3658
+ white-space: nowrap;
3659
+ overflow: hidden;
3660
+ text-overflow: ellipsis;
3661
+ flex: 1;
3662
+ }
3663
+
3664
+ /* Thinking body */
3665
+ .reasoning-think-body {
3666
+ font-size: 10px;
3667
+ font-family: var(--font-mono);
3668
+ color: var(--text-muted);
3669
+ line-height: 1.55;
3670
+ white-space: pre-wrap;
3671
+ word-break: break-word;
3672
+ max-height: 120px;
3673
+ overflow-y: auto;
3674
+ padding: 4px 2px 0;
3675
+ opacity: 0.75;
3676
+ scrollbar-width: thin;
3677
+ scrollbar-color: rgba(0, 212, 255, 0.15) transparent;
3678
+ }
3679
+ .reasoning-think-body::-webkit-scrollbar { width: 2px; }
3680
+ .reasoning-think-body::-webkit-scrollbar-thumb { background: rgba(0, 212, 255, 0.15); border-radius: 2px; }
3681
+
3682
+ /* Tool detail — compact JSON preview, collapsible */
3683
+ .reasoning-tool-preview {
3684
+ font-size: 10px;
3685
+ font-family: var(--font-mono);
3686
+ color: var(--text-muted);
3687
+ opacity: 0.65;
3688
+ white-space: nowrap;
3689
+ overflow: hidden;
3690
+ text-overflow: ellipsis;
3691
+ padding: 2px 0 0;
3692
+ }
3693
+ .reasoning-tool-detail {
3694
+ display: none;
3695
+ font-size: 10px;
3696
+ font-family: var(--font-mono);
3697
+ color: var(--text-muted);
3698
+ white-space: pre-wrap;
3699
+ word-break: break-all;
3700
+ padding: 4px 2px 0;
3701
+ opacity: 0.65;
3702
+ max-height: 100px;
3703
+ overflow-y: auto;
3704
+ }
3705
+ .reasoning-entry.expanded .reasoning-tool-detail { display: block; }
3706
+ .reasoning-entry.expanded .reasoning-tool-preview { display: none; }
3707
+
3708
+ /* Result row */
3709
+ .reasoning-result-meta {
3710
+ font-size: 10px;
3711
+ font-family: var(--font-mono);
3712
+ color: var(--text-dim);
3713
+ padding: 2px 0 0;
3714
+ }
@@ -138,6 +138,25 @@
138
138
  </button>
139
139
  </div>
140
140
 
141
+ <!-- Reasoning Panel -->
142
+ <div class="glass-panel reasoning-panel" id="reasoning-panel">
143
+ <div class="panel-label">
144
+ REASONING
145
+ <span class="reasoning-live-dot" id="reasoning-live-dot"></span>
146
+ </div>
147
+ <div class="reasoning-feed" id="reasoning-feed">
148
+ <div class="reasoning-empty" id="reasoning-empty">
149
+ <div class="reasoning-empty-icon">
150
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
151
+ <circle cx="12" cy="12" r="3"/>
152
+ <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"/>
153
+ </svg>
154
+ </div>
155
+ <div class="reasoning-empty-text">No reasoning yet</div>
156
+ </div>
157
+ </div>
158
+ </div>
159
+
141
160
  </aside>
142
161
 
143
162
  <!-- Metrics — Right column -->
@@ -195,6 +195,9 @@ function handleRunFailure(reason) {
195
195
  // Stop timers immediately
196
196
  stopElapsedTimer();
197
197
  clearWatchdog();
198
+ if (typeof window.closeLiveThinking === "function") {
199
+ window.closeLiveThinking();
200
+ }
198
201
 
199
202
  // Clean up any in-flight UI elements
200
203
  if (thinkingEl) {
@@ -243,19 +246,26 @@ function handleRunFailure(reason) {
243
246
 
244
247
  // ── Render history (on first connect) ─────────────────────────────
245
248
  function renderHistory(messages) {
249
+ // Clear reasoning panel in sync with the feed — prevents double-entries on reconnect
250
+ if (typeof window.clearReasoningPanel === "function") {
251
+ window.clearReasoningPanel();
252
+ }
246
253
  responseArea.innerHTML = "";
247
254
  for (const m of messages) {
248
255
  if (!m || !m.role) {
249
256
  continue;
250
257
  }
251
258
  const hasContent = Array.isArray(m.content)
252
- ? m.content.some((b) => (b.text ?? b.thinking ?? b.name ?? "").trim())
259
+ ? m.content.some((b) => b.type === "text" && (b.text ?? "").trim())
253
260
  : extractText(m.content).trim();
254
261
  if (!hasContent) {
255
262
  continue;
256
263
  }
257
264
 
258
265
  const el = window.renderMessage(m);
266
+ if (!el) {
267
+ continue;
268
+ }
259
269
  responseArea.appendChild(el);
260
270
  window.applyHighlighting(el);
261
271
  }
@@ -301,9 +311,18 @@ function handleGatewayEvent(event) {
301
311
  if (text) {
302
312
  updateStream(text);
303
313
  }
314
+ // Stream thinking deltas live to the Reasoning Panel
315
+ const thinkingText =
316
+ typeof window.extractThinkingText === "function" ? window.extractThinkingText(p.message) : "";
317
+ if (thinkingText && typeof window.updateLiveThinking === "function") {
318
+ window.updateLiveThinking(thinkingText);
319
+ }
304
320
  } else if (p.state === "final") {
305
321
  stopElapsedTimer();
306
322
  clearWatchdog();
323
+ if (typeof window.closeLiveThinking === "function") {
324
+ window.closeLiveThinking();
325
+ }
307
326
  closeStreamBubble();
308
327
  setAgentStatus("done");
309
328
  isStreaming = false;
@@ -316,6 +335,9 @@ function handleGatewayEvent(event) {
316
335
  // Clean abort (user-initiated or model decided to stop) — not an error
317
336
  stopElapsedTimer();
318
337
  clearWatchdog();
338
+ if (typeof window.closeLiveThinking === "function") {
339
+ window.closeLiveThinking();
340
+ }
319
341
  if (streamBubble) {
320
342
  closeStreamBubble();
321
343
  }
@@ -371,6 +393,13 @@ function setAgentStatus(key) {
371
393
  asoSub.textContent = s.sub;
372
394
  }
373
395
 
396
+ // Pulse the reasoning live-dot while agent is actively thinking/streaming
397
+ const reasoningDot = document.getElementById("reasoning-live-dot");
398
+ if (reasoningDot) {
399
+ const active = key === "thinking" || key === "streaming" || key === "waiting";
400
+ reasoningDot.classList.toggle("active", active);
401
+ }
402
+
374
403
  // ── Elapsed timer management ──────────────────────────────────
375
404
  if (key === "thinking") {
376
405
  // Start elapsed timer and watchdog when processing begins
@@ -476,6 +505,11 @@ async function sendText(text) {
476
505
  addUserMessage(text);
477
506
  await sleep(200);
478
507
 
508
+ // Mark the start of this run in the Reasoning Panel
509
+ if (typeof window.injectReasoningRunSeparator === "function") {
510
+ window.injectReasoningRunSeparator();
511
+ }
512
+
479
513
  setAgentStatus("waiting");
480
514
  thinkingEl = createThinkingBubble();
481
515
  setAgentStatus("thinking");
@@ -532,6 +566,9 @@ async function handleNewSession() {
532
566
 
533
567
  responseArea.innerHTML = "";
534
568
  responseArea.style.opacity = "1";
569
+ if (typeof window.clearReasoningPanel === "function") {
570
+ window.clearReasoningPanel();
571
+ }
535
572
 
536
573
  // Show empty-state indicator
537
574
  const cleared = document.createElement("div");
@@ -497,6 +497,216 @@ function formatTime(ts) {
497
497
  // Expose renderBlock for use in app.js streaming finalization
498
498
  window.renderBlock = renderBlock;
499
499
 
500
+ // ── Reasoning Panel — append a block ─────────────────────────────────
501
+ window.appendToReasoningPanel = function (block) {
502
+ const feed = document.getElementById("reasoning-feed");
503
+ if (!feed) {
504
+ return;
505
+ }
506
+
507
+ // Remove empty-state placeholder on first real entry
508
+ const empty = document.getElementById("reasoning-empty");
509
+ if (empty) {
510
+ empty.remove();
511
+ }
512
+
513
+ const entry = document.createElement("div");
514
+ entry.className = "reasoning-entry";
515
+
516
+ switch (block.type) {
517
+ // ── Thinking block ──────────────────────────────────────────────
518
+ case "thinking": {
519
+ const text = (block.thinking ?? "").trim();
520
+ if (!text) {
521
+ return;
522
+ }
523
+ entry.innerHTML = `
524
+ <div class="reasoning-entry-header">
525
+ <span class="reasoning-entry-badge badge-think">◈ THINK</span>
526
+ <span class="reasoning-entry-name">${escHtml(String(text).split("\n")[0].slice(0, 60))}${text.length > 60 ? "…" : ""}</span>
527
+ </div>
528
+ <div class="reasoning-think-body">${escHtml(text)}</div>
529
+ `;
530
+ break;
531
+ }
532
+
533
+ // ── Tool call ───────────────────────────────────────────────────
534
+ case "tool_use": {
535
+ const name = block.name ?? "tool";
536
+ const inputJson = block.input ? JSON.stringify(block.input, null, 2) : "{}";
537
+ // One-line preview: first key=value pair
538
+ let preview = "";
539
+ try {
540
+ const keys = Object.keys(block.input ?? {});
541
+ if (keys.length) {
542
+ const val = String(block.input[keys[0]]).slice(0, 50);
543
+ preview = `${keys[0]}: ${val}${val.length >= 50 ? "…" : ""}`;
544
+ }
545
+ } catch {
546
+ /* ignore */
547
+ }
548
+ entry.innerHTML = `
549
+ <div class="reasoning-entry-header">
550
+ <span class="reasoning-entry-badge badge-tool">${escHtml(toolIcon(name))} TOOL</span>
551
+ <span class="reasoning-entry-name">${escHtml(formatToolName(name))}</span>
552
+ </div>
553
+ ${preview ? `<div class="reasoning-tool-preview">${escHtml(preview)}</div>` : ""}
554
+ <div class="reasoning-tool-detail">${escHtml(inputJson)}</div>
555
+ `;
556
+ // Toggle expand on click
557
+ entry.style.cursor = "pointer";
558
+ entry.addEventListener("click", () => entry.classList.toggle("expanded"));
559
+ break;
560
+ }
561
+
562
+ // ── Tool result ─────────────────────────────────────────────────
563
+ case "tool_result": {
564
+ const content = Array.isArray(block.content)
565
+ ? block.content.map((b) => b.text ?? "").join("\n")
566
+ : String(block.content ?? "");
567
+ const chars = content.length;
568
+ const isError = block.is_error === true;
569
+ entry.innerHTML = `
570
+ <div class="reasoning-entry-header">
571
+ <span class="reasoning-entry-badge badge-result">${isError ? "⚠ ERROR" : "↩ RESULT"}</span>
572
+ <span class="reasoning-entry-name">${chars} chars</span>
573
+ </div>
574
+ <div class="reasoning-result-meta">${escHtml(content.slice(0, 80))}${chars > 80 ? "…" : ""}</div>
575
+ `;
576
+ break;
577
+ }
578
+
579
+ default:
580
+ return; // unknown block — skip
581
+ }
582
+
583
+ feed.appendChild(entry);
584
+ feed.scrollTop = feed.scrollHeight;
585
+ };
586
+
587
+ // ── Reasoning Panel — run separator ──────────────────────────────────
588
+ window.injectReasoningRunSeparator = function () {
589
+ const feed = document.getElementById("reasoning-feed");
590
+ if (!feed) {
591
+ return;
592
+ }
593
+ const empty = document.getElementById("reasoning-empty");
594
+ if (empty) {
595
+ empty.remove();
596
+ }
597
+ const now = new Date();
598
+ const hhmm = now.toLocaleTimeString("en-US", {
599
+ hour: "2-digit",
600
+ minute: "2-digit",
601
+ hour12: false,
602
+ });
603
+ const sep = document.createElement("div");
604
+ sep.className = "reasoning-run-sep";
605
+ sep.innerHTML = `<span class="reasoning-run-sep-label">RUN · ${hhmm}</span>`;
606
+ feed.appendChild(sep);
607
+ feed.scrollTop = feed.scrollHeight;
608
+ };
609
+
610
+ // ── Reasoning Panel — clear ───────────────────────────────────────────
611
+ window.clearReasoningPanel = function () {
612
+ const feed = document.getElementById("reasoning-feed");
613
+ if (!feed) {
614
+ return;
615
+ }
616
+ feed.innerHTML = `
617
+ <div class="reasoning-empty" id="reasoning-empty">
618
+ <div class="reasoning-empty-icon">
619
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
620
+ <circle cx="12" cy="12" r="3"/>
621
+ <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"/>
622
+ </svg>
623
+ </div>
624
+ <div class="reasoning-empty-text">No reasoning yet</div>
625
+ </div>`;
626
+ };
627
+
628
+ // ── Reasoning Panel — live thinking update (streaming) ───────────────
629
+ // Called repeatedly during a run to accumulate thinking text in real-time.
630
+ // Creates a single "live" entry and updates it in-place until finalized.
631
+ let _liveThinkEntry = null;
632
+ let _liveThinkBody = null;
633
+ let _liveThinkBuffer = "";
634
+
635
+ window.openLiveThinking = function () {
636
+ const feed = document.getElementById("reasoning-feed");
637
+ if (!feed) {
638
+ return;
639
+ }
640
+ const empty = document.getElementById("reasoning-empty");
641
+ if (empty) {
642
+ empty.remove();
643
+ }
644
+ _liveThinkBuffer = "";
645
+ const entry = document.createElement("div");
646
+ entry.className = "reasoning-entry";
647
+ entry.id = "reasoning-live-think";
648
+ entry.innerHTML = `
649
+ <div class="reasoning-entry-header">
650
+ <span class="reasoning-entry-badge badge-think">◈ THINK</span>
651
+ <span class="reasoning-entry-name" id="reasoning-live-name">…</span>
652
+ </div>
653
+ <div class="reasoning-think-body" id="reasoning-live-body"></div>
654
+ `;
655
+ feed.appendChild(entry);
656
+ _liveThinkEntry = entry;
657
+ _liveThinkBody = entry.querySelector("#reasoning-live-body");
658
+ feed.scrollTop = feed.scrollHeight;
659
+ };
660
+
661
+ window.updateLiveThinking = function (text) {
662
+ if (!_liveThinkBody) {
663
+ window.openLiveThinking();
664
+ }
665
+ _liveThinkBuffer += text;
666
+ if (_liveThinkBody) {
667
+ _liveThinkBody.textContent = _liveThinkBuffer;
668
+ const feed = document.getElementById("reasoning-feed");
669
+ if (feed) {
670
+ feed.scrollTop = feed.scrollHeight;
671
+ }
672
+ }
673
+ // Update name preview
674
+ const nameEl = _liveThinkEntry?.querySelector("#reasoning-live-name");
675
+ if (nameEl) {
676
+ const firstLine = _liveThinkBuffer.split("\n")[0].slice(0, 60);
677
+ nameEl.textContent = firstLine + (_liveThinkBuffer.length > 60 ? "…" : "");
678
+ }
679
+ };
680
+
681
+ window.closeLiveThinking = function () {
682
+ if (_liveThinkEntry) {
683
+ _liveThinkEntry.removeAttribute("id");
684
+ _liveThinkEntry = null;
685
+ _liveThinkBody = null;
686
+ _liveThinkBuffer = "";
687
+ }
688
+ };
689
+
690
+ // ── Extract thinking text from a content array (for streaming deltas) ─
691
+ window.extractThinkingText = function (content) {
692
+ if (!content) {
693
+ return "";
694
+ }
695
+ if (typeof content === "string") {
696
+ return "";
697
+ }
698
+ if (Array.isArray(content)) {
699
+ return content
700
+ .filter((b) => b?.type === "thinking")
701
+ .map((b) => b.thinking ?? "")
702
+ .join("");
703
+ }
704
+ if (content?.content) {
705
+ return window.extractThinkingText(content.content);
706
+ }
707
+ return "";
708
+ };
709
+
500
710
  // ── Main render function — builds a full message element ──────────────
501
711
  window.renderMessage = function (message) {
502
712
  const { role, content, timestamp } = message;
@@ -523,15 +733,29 @@ window.renderMessage = function (message) {
523
733
  bubble.appendChild(copyBtn);
524
734
  }
525
735
 
526
- // Render each content block
736
+ // Render each content block — route reasoning/tool blocks to the side panel
737
+ const REASONING_TYPES = new Set(["thinking", "tool_use", "tool_result"]);
527
738
  const blocks = Array.isArray(content) ? content : [{ type: "text", text: extractText(content) }];
528
739
  for (const block of blocks) {
740
+ if (!isUser && REASONING_TYPES.has(block.type)) {
741
+ // Route to Reasoning Panel — keep response bubble clean
742
+ window.appendToReasoningPanel(block);
743
+ continue;
744
+ }
529
745
  const el = renderBlock(block);
530
746
  if (el.childNodes.length || el.innerHTML) {
531
747
  bubble.appendChild(el);
532
748
  }
533
749
  }
534
750
 
751
+ // If the bubble has no visible content (only copy button), skip it entirely
752
+ const visibleChildren = bubble.querySelectorAll(
753
+ ".msg-text, .msg-image, .msg-thinking, .msg-tool-card, .msg-tool-result",
754
+ );
755
+ if (!isUser && visibleChildren.length === 0) {
756
+ return null;
757
+ }
758
+
535
759
  // Timestamp
536
760
  if (timestamp) {
537
761
  const ts = document.createElement("div");
@@ -5,7 +5,7 @@ import { c as getActivePluginRegistry, v as createInternalHookEvent, x as trigge
5
5
  import { t as createSubsystemLogger } from "./subsystem-Bs9YvKLa.js";
6
6
  import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-H1H1LiSQ.js";
7
7
  import { r as normalizeChannelId, t as getChannelPlugin } from "./plugins-DQYI3Fr-.js";
8
- import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-kB5lBgXk.js";
8
+ import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-x8rJur4F.js";
9
9
  import { d as getChannelDock } from "./thinking-CdlENGRW.js";
10
10
  import { c as resolveChunkMode, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, n as chunkByParagraph } from "./chunk-BW5f05BR.js";
11
11
  import { n as resolveMarkdownTableMode } from "./markdown-tables-iMQQZu4Q.js";
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { R as shortenHomeInString, k as isRecord } from "./registry-CK4e9hn8.js";
3
3
  import { B as resolveImplicitCopilotProvider, J as normalizeSecretInput, R as normalizeProviders, V as resolveImplicitProviders, r as requireApiKey, t as getApiKeyForModel, y as resolveSymiAgentDir, z as resolveImplicitBedrockProvider } from "./model-auth-CeL58m55.js";
4
4
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-DaNAekda.js";
5
- import { N as sanitizeUserFacingText } from "./pi-embedded-helpers-kB5lBgXk.js";
5
+ import { N as sanitizeUserFacingText } from "./pi-embedded-helpers-x8rJur4F.js";
6
6
  import { n as loadConfig } from "./config-DM0K7qC1.js";
7
7
  import { n as redactToolDetail } from "./redact-jSxx6Ep2.js";
8
8
  import fs from "node:fs/promises";
@@ -4,7 +4,7 @@ import { c as resolveDefaultAgentId, r as resolveAgentDir, s as resolveAgentWork
4
4
  import "./subsystem-Bs9YvKLa.js";
5
5
  import "./workspace-wAaHI8-5.js";
6
6
  import "./tokens-H1H1LiSQ.js";
7
- import { t as runEmbeddedPiAgent } from "./pi-embedded-BjzaB3CT.js";
7
+ import { t as runEmbeddedPiAgent } from "./pi-embedded-ZzUH4ioO.js";
8
8
  import "./plugins-DQYI3Fr-.js";
9
9
  import "./accounts-tNElYrCH.js";
10
10
  import "./boolean-B8-BqKGQ.js";
@@ -12,7 +12,7 @@ import "./command-format-BaxDnULz.js";
12
12
  import "./bindings-B7Ke6LJi.js";
13
13
  import "./send-CHOArYFe.js";
14
14
  import "./send-D3M6pMr5.js";
15
- import "./deliver-B3UoBZdC.js";
15
+ import "./deliver-DD3gs9SF.js";
16
16
  import "./diagnostic-CI0kRQkt.js";
17
17
  import "./diagnostic-session-state-Bxo4UHOL.js";
18
18
  import "./accounts-CWktKM8a.js";
@@ -22,10 +22,10 @@ import "./model-auth-CeL58m55.js";
22
22
  import "./github-copilot-token-C_qUP7p5.js";
23
23
  import "./pi-model-discovery-DaNAekda.js";
24
24
  import "./message-channel-Dz5lr5b0.js";
25
- import "./pi-embedded-helpers-kB5lBgXk.js";
25
+ import "./pi-embedded-helpers-x8rJur4F.js";
26
26
  import "./config-DM0K7qC1.js";
27
27
  import "./manifest-registry-D0IQ3WuX.js";
28
- import "./chrome-LmEyZdbC.js";
28
+ import "./chrome-BATLK3yK.js";
29
29
  import "./frontmatter-C_bv_0P8.js";
30
30
  import "./skills-BFekKL7i.js";
31
31
  import "./redact-jSxx6Ep2.js";
@@ -36,7 +36,7 @@ import "./thinking-CdlENGRW.js";
36
36
  import "./accounts-qtxJ-6em.js";
37
37
  import "./paths-DLyHUt31.js";
38
38
  import "./tool-images-DXB7tqWi.js";
39
- import "./image-RFofsrof.js";
39
+ import "./image-RLbZ3RUn.js";
40
40
  import "./reply-prefix-XlyuyChD.js";
41
41
  import "./manager-B5EXdBQV.js";
42
42
  import "./gemini-auth-7AWT6JXV.js";
@@ -50,7 +50,7 @@ import "./ir-DccrnjsE.js";
50
50
  import "./render-CDCvpfhh.js";
51
51
  import "./commands-registry-C3C4Rv3O.js";
52
52
  import "./skill-commands-B64uavY9.js";
53
- import "./runner-DOvsNiYz.js";
53
+ import "./runner-DjHRFXSI.js";
54
54
  import "./fetch-Bso4i15F.js";
55
55
  import "./channel-activity-CsM_hJ_s.js";
56
56
  import "./tables-DuZspiBu.js";
@@ -13,7 +13,7 @@ import { t as parseBooleanValue$1 } from "./boolean-B8-BqKGQ.js";
13
13
  import { n as resolveCliName, r as isTruthyEnvValue, t as formatCliCommand } from "./command-format-BaxDnULz.js";
14
14
  import { a as resolveSlackWebClientOptions, c as buildSlackBlocksFallbackText, i as createSlackWebClient, l as parseSlackTarget, o as parseSlackBlocksInput, s as validateSlackBlocksArray, t as sendMessageSlack, u as resolveSlackChannelId } from "./send-CHOArYFe.js";
15
15
  import { $ as fetchChannelPermissionsDiscord, A as unpinMessageDiscord, B as listScheduledEventsDiscord, C as editMessageDiscord, Ct as resolveTimestampMs, D as pinMessageDiscord, Dt as normalizeChannelSlug, E as listThreadsDiscord, Et as buildChannelKeyCandidates, F as fetchMemberInfoDiscord, G as uploadStickerDiscord, H as timeoutMemberDiscord, I as fetchRoleInfoDiscord, J as editChannelDiscord, K as createChannelDiscord, L as fetchVoiceStatusDiscord, M as banMemberDiscord, N as createScheduledEventDiscord, O as readMessagesDiscord, Ot as resolveChannelEntryMatchWithFallback, P as fetchChannelInfoDiscord, Q as stripUndefinedFields, R as kickMemberDiscord, S as deleteMessageDiscord, St as resolveDiscordSystemLocation, T as listPinsDiscord, Tt as applyChannelMatchMeta, U as listGuildEmojisDiscord, V as removeRoleDiscord, W as uploadEmojiDiscord, X as removeChannelPermissionDiscord, Y as moveChannelDiscord, Z as setChannelPermissionDiscord, _ as sendPollDiscord, _t as resolveDiscordShouldRequireMention, a as removeReactionDiscord, at as resolveDiscordChannelId, b as sendWebhookMessageDiscord, bt as formatDiscordReactionEmoji, c as formatDiscordComponentEventText, ct as allowListMatches$1, d as parseDiscordModalCustomId, dt as normalizeDiscordSlug, et as hasAnyGuildPermissionDiscord, f as parseDiscordModalCustomIdForCarbon, ft as resolveDiscordAllowListMatch, g as sendMessageDiscord, gt as resolveDiscordOwnerAllowFrom, h as resolveDiscordModalEntry, ht as resolveDiscordMemberAccessState, i as removeOwnReactionsDiscord, it as parseDiscordTarget, j as addRoleDiscord, k as searchMessagesDiscord, l as parseDiscordComponentCustomId, lt as isDiscordGroupAllowedByPolicy, m as resolveDiscordComponentEntry, mt as resolveDiscordGuildEntry, n as fetchReactionsDiscord, nt as createDiscordClient, o as sendDiscordComponentMessage, ot as listDiscordDirectoryGroupsLive, p as readDiscordComponentSpec, pt as resolveDiscordChannelConfigWithFallback, q as deleteChannelDiscord, r as reactMessageDiscord, rt as createDiscordRestClient, s as createDiscordFormModal, st as listDiscordDirectoryPeersLive, tt as chunkDiscordTextWithMode, u as parseDiscordComponentCustomIdForCarbon, ut as normalizeDiscordAllowList, v as sendStickerDiscord, vt as resolveGroupDmAllow, w as fetchMessageDiscord, wt as fetchDiscord, x as createThreadDiscord, xt as formatDiscordUserTag, y as sendVoiceMessageDiscord, yt as shouldEmitDiscordReactionNotification, z as listGuildChannelsDiscord } from "./send-D3M6pMr5.js";
16
- import { C as getGlobalHookRunner, S as parseInlineDirectives$1, _ as normalizeTargetForProvider, a as normalizeOutboundPayloadsForJson, b as MEDIA_TOKEN_RE, c as applyReplyThreading, d as isRenderablePayload, f as shouldSuppressMessagingToolReplies, g as normalizeChannelTargetInput, h as buildTargetResolverSignature, i as normalizeOutboundPayloads, l as filterMessagingToolDuplicates, m as resolveReplyToMode, o as normalizeReplyPayloadsForDelivery, p as createReplyToModeFilterForChannel, r as formatOutboundPayloadLog, s as applyReplyTagsToPayload, t as deliverOutboundPayloads, u as filterMessagingToolMediaDuplicates, v as throwIfAborted, w as initializeGlobalHookRunner, x as splitMediaFromOutput, y as parseReplyDirectives } from "./deliver-B3UoBZdC.js";
16
+ import { C as getGlobalHookRunner, S as parseInlineDirectives$1, _ as normalizeTargetForProvider, a as normalizeOutboundPayloadsForJson, b as MEDIA_TOKEN_RE, c as applyReplyThreading, d as isRenderablePayload, f as shouldSuppressMessagingToolReplies, g as normalizeChannelTargetInput, h as buildTargetResolverSignature, i as normalizeOutboundPayloads, l as filterMessagingToolDuplicates, m as resolveReplyToMode, o as normalizeReplyPayloadsForDelivery, p as createReplyToModeFilterForChannel, r as formatOutboundPayloadLog, s as applyReplyTagsToPayload, t as deliverOutboundPayloads, u as filterMessagingToolMediaDuplicates, v as throwIfAborted, w as initializeGlobalHookRunner, x as splitMediaFromOutput, y as parseReplyDirectives } from "./deliver-DD3gs9SF.js";
17
17
  import { a as logMessageProcessed, c as logWebhookError, d as startDiagnosticHeartbeat, f as stopDiagnosticHeartbeat, i as logLaneEnqueue, l as logWebhookProcessed, m as isDiagnosticsEnabled, o as logMessageQueued, p as emitDiagnosticEvent, r as logLaneDequeue, s as logSessionStateChange, t as diag, u as logWebhookReceived } from "./diagnostic-CI0kRQkt.js";
18
18
  import { r as getDiagnosticSessionState } from "./diagnostic-session-state-Bxo4UHOL.js";
19
19
  import { n as resolveSignalAccount, t as listEnabledSignalAccounts } from "./accounts-CWktKM8a.js";
@@ -23,10 +23,10 @@ import { A as normalizeProviderId, C as buildAllowedModelSet, D as isCliProvider
23
23
  import { a as saveJsonFile, i as loadJsonFile } from "./github-copilot-token-C_qUP7p5.js";
24
24
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-DaNAekda.js";
25
25
  import { a as isMarkdownCapableMessageChannel, c as resolveGatewayMessageChannel, d as GATEWAY_CLIENT_MODES, f as GATEWAY_CLIENT_NAMES, i as isInternalMessageChannel, l as resolveMessageChannel, n as isDeliverableMessageChannel, o as listDeliverableMessageChannels, r as isGatewayMessageChannel, s as normalizeMessageChannel, t as INTERNAL_MESSAGE_CHANNEL, u as GATEWAY_CLIENT_IDS } from "./message-channel-Dz5lr5b0.js";
26
- import { $ as normalizeDeliveryContext, A as isTransientHttpError, At as DEFAULT_UPLOAD_DIR, Bt as expandToolGroups, C as isContextOverflowError, Ct as resolveGroupSessionKey, D as isRateLimitAssistantError, Dt as registerBrowserRoutes, E as isLikelyContextOverflowError, Et as createBrowserRouteContext, F as resolveSandboxContext, Ft as resolveSandboxConfigForAgent, G as updateLastRoute, Gt as compileGlobPatterns, H as loadSessionStore, Ht as normalizeToolName, I as resolveSandboxRuntimeStatus, It as applyOwnerOnlyToolPolicy, J as isCacheEnabled, Jt as ensureSessionHeader, K as updateSessionStore, Kt as matchesAnyGlobPattern, L as extractDeliveryInfo, Lt as buildPluginToolGroups, M as parseImageSizeError, Mt as getBridgeAuthForPort, N as sanitizeUserFacingText, Nt as ensureBrowserControlAuth, O as isRawApiErrorPayload, Ot as resolveBrowserConfig, P as ensureSandboxWorkspaceForSession, Pt as resolveBrowserControlAuth, Q as mergeDeliveryContext, R as parseSessionThreadInfo, Rt as collectExplicitAllowlist, S as isCompactionFailureError, St as deriveSessionMetaPatch, T as isFailoverErrorMessage, Tt as resolveSessionLockMaxHoldFromTimeout, U as readSessionUpdatedAt, Ut as resolveToolProfilePolicy, V as resolveAndPersistSessionFile, Vt as mergeAlsoAllowPolicy, W as recordSessionMetaFromInbound, Wt as stripPluginOnlyAllowlist, X as deliveryContextFromSession, Xt as resolveBootstrapTotalMaxChars, Y as resolveCacheTtlMs$1, Yt as resolveBootstrapMaxChars, Z as deliveryContextKey, Zt as sanitizeGoogleTurnOrdering, _ as formatRawAssistantErrorForUi, _t as resolveFreshSessionTotalTokens, a as isMessagingToolDuplicateNormalized, at as extractToolCallNames, b as isBillingAssistantError, bt as resolveExplicitAgentSessionKey, c as extractToolCallsFromAssistant, ct as hasInterSessionUserProvenance, d as isAntigravityClaude, dt as evaluateSessionFreshness, et as normalizeSessionDeliveryFields, f as isGoogleModelApi, ft as resolveChannelResetConfig, g as formatBillingErrorMessage, gt as DEFAULT_RESET_TRIGGERS, h as formatAssistantErrorText, ht as resolveThreadFlag, it as countToolResults, j as parseImageDimensionError, jt as resolveExistingPathsWithinRoot, k as isTimeoutErrorMessage, kt as resolveProfile, l as extractToolResultId, lt as normalizeInputProvenance, m as classifyFailoverReason, mt as resolveSessionResetType, n as validateGeminiTurns, nt as archiveSessionTranscripts, o as normalizeTextForComparison, ot as INPUT_PROVENANCE_KIND_VALUES, p as BILLING_ERROR_USER_MESSAGE, pt as resolveSessionResetPolicy, q as updateSessionStoreEntry, qt as buildBootstrapContextFiles, r as pickFallbackThinkingLevel, rt as capArrayByJsonBytes, s as sanitizeSessionMessagesImages, st as applyInputProvenanceToUserMessage, t as validateAnthropicTurns, tt as normalizeAccountId$3, u as downgradeOpenAIReasoningBlocks, ut as resolveSessionKey, v as getApiErrorPayloadFingerprint, vt as canonicalizeMainSessionAlias, w as isFailoverAssistantError, wt as acquireSessionWriteLock, x as isCloudCodeAssistFormatError, xt as resolveMainSessionKey, y as isAuthAssistantError, z as appendAssistantMessageToSessionTranscript, zt as expandPolicyWithPluginGroups } from "./pi-embedded-helpers-kB5lBgXk.js";
26
+ import { $ as normalizeDeliveryContext, A as isTransientHttpError, At as DEFAULT_UPLOAD_DIR, Bt as expandToolGroups, C as isContextOverflowError, Ct as resolveGroupSessionKey, D as isRateLimitAssistantError, Dt as registerBrowserRoutes, E as isLikelyContextOverflowError, Et as createBrowserRouteContext, F as resolveSandboxContext, Ft as resolveSandboxConfigForAgent, G as updateLastRoute, Gt as compileGlobPatterns, H as loadSessionStore, Ht as normalizeToolName, I as resolveSandboxRuntimeStatus, It as applyOwnerOnlyToolPolicy, J as isCacheEnabled, Jt as ensureSessionHeader, K as updateSessionStore, Kt as matchesAnyGlobPattern, L as extractDeliveryInfo, Lt as buildPluginToolGroups, M as parseImageSizeError, Mt as getBridgeAuthForPort, N as sanitizeUserFacingText, Nt as ensureBrowserControlAuth, O as isRawApiErrorPayload, Ot as resolveBrowserConfig, P as ensureSandboxWorkspaceForSession, Pt as resolveBrowserControlAuth, Q as mergeDeliveryContext, R as parseSessionThreadInfo, Rt as collectExplicitAllowlist, S as isCompactionFailureError, St as deriveSessionMetaPatch, T as isFailoverErrorMessage, Tt as resolveSessionLockMaxHoldFromTimeout, U as readSessionUpdatedAt, Ut as resolveToolProfilePolicy, V as resolveAndPersistSessionFile, Vt as mergeAlsoAllowPolicy, W as recordSessionMetaFromInbound, Wt as stripPluginOnlyAllowlist, X as deliveryContextFromSession, Xt as resolveBootstrapTotalMaxChars, Y as resolveCacheTtlMs$1, Yt as resolveBootstrapMaxChars, Z as deliveryContextKey, Zt as sanitizeGoogleTurnOrdering, _ as formatRawAssistantErrorForUi, _t as resolveFreshSessionTotalTokens, a as isMessagingToolDuplicateNormalized, at as extractToolCallNames, b as isBillingAssistantError, bt as resolveExplicitAgentSessionKey, c as extractToolCallsFromAssistant, ct as hasInterSessionUserProvenance, d as isAntigravityClaude, dt as evaluateSessionFreshness, et as normalizeSessionDeliveryFields, f as isGoogleModelApi, ft as resolveChannelResetConfig, g as formatBillingErrorMessage, gt as DEFAULT_RESET_TRIGGERS, h as formatAssistantErrorText, ht as resolveThreadFlag, it as countToolResults, j as parseImageDimensionError, jt as resolveExistingPathsWithinRoot, k as isTimeoutErrorMessage, kt as resolveProfile, l as extractToolResultId, lt as normalizeInputProvenance, m as classifyFailoverReason, mt as resolveSessionResetType, n as validateGeminiTurns, nt as archiveSessionTranscripts, o as normalizeTextForComparison, ot as INPUT_PROVENANCE_KIND_VALUES, p as BILLING_ERROR_USER_MESSAGE, pt as resolveSessionResetPolicy, q as updateSessionStoreEntry, qt as buildBootstrapContextFiles, r as pickFallbackThinkingLevel, rt as capArrayByJsonBytes, s as sanitizeSessionMessagesImages, st as applyInputProvenanceToUserMessage, t as validateAnthropicTurns, tt as normalizeAccountId$3, u as downgradeOpenAIReasoningBlocks, ut as resolveSessionKey, v as getApiErrorPayloadFingerprint, vt as canonicalizeMainSessionAlias, w as isFailoverAssistantError, wt as acquireSessionWriteLock, x as isCloudCodeAssistFormatError, xt as resolveMainSessionKey, y as isAuthAssistantError, z as appendAssistantMessageToSessionTranscript, zt as expandPolicyWithPluginGroups } from "./pi-embedded-helpers-x8rJur4F.js";
27
27
  import { A as VERSION, C as getConfigValueAtPath, D as isSafeExecutableValue, E as unsetConfigValueAtPath, O as DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH, S as unsetConfigOverride, T as setConfigValueAtPath, _ as parseDurationMs, a as writeConfigFile, b as resetConfigOverrides, c as TELEGRAM_COMMAND_NAME_PATTERN, f as isInboundPathAllowed, g as normalizeScpRemoteHost, h as resolveIMessageRemoteAttachmentRoots, i as resolveConfigSnapshotHash, k as resolveAgentMaxConcurrent, l as normalizeTelegramCommandName, m as resolveIMessageAttachmentRoots, n as loadConfig, o as validateConfigObjectWithPlugins, r as readConfigFileSnapshot, u as resolveTelegramCustomCommands, v as validateJsonSchemaValue, w as parseConfigPath, x as setConfigOverride, y as getConfigOverrides } from "./config-DM0K7qC1.js";
28
28
  import { a as applyTestPluginDefaults, c as resolveMemorySlotDecision, d as isDangerousHostEnvVarName, i as safeStatSync, n as discoverSymiPlugins, o as normalizePluginsConfig, r as isPathInside, s as resolveEnableState, t as loadPluginManifestRegistry, u as isPathInsideWithRealpath } from "./manifest-registry-D0IQ3WuX.js";
29
- import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-LmEyZdbC.js";
29
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-BATLK3yK.js";
30
30
  import { c as assertSandboxPath, d as resolveSandboxedMediaSource, f as applySkillEnvOverrides, i as resolveSkillsPromptForRun, l as resolveSandboxInputPath, n as buildWorkspaceSkillSnapshot, p as applySkillEnvOverridesFromSnapshot, r as loadWorkspaceSkillEntries, s as assertMediaNotDataUrl } from "./skills-BFekKL7i.js";
31
31
  import { n as formatErrorMessage, r as formatUncaughtError } from "./errors-BoQgnc8X.js";
32
32
  import { i as isBlockedHostnameOrIp, o as normalizeHostname, t as SsrFBlockedError } from "./ssrf-BTMDZjHT.js";
@@ -37,7 +37,7 @@ import { t as resolveIMessageAccount } from "./accounts-qtxJ-6em.js";
37
37
  import { i as resolveSessionTranscriptPath, n as resolveSessionFilePath, o as resolveSessionTranscriptsDirForAgent, r as resolveSessionFilePathOptions, s as resolveStorePath, t as resolveDefaultSessionStorePath } from "./paths-DLyHUt31.js";
38
38
  import { t as emitSessionTranscriptUpdate } from "./transcript-events-DDYvbmRV.js";
39
39
  import { i as resolveImageSanitizationLimits, n as sanitizeImageBlocks, r as sanitizeToolResultImages } from "./tool-images-DXB7tqWi.js";
40
- import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-RFofsrof.js";
40
+ import { S as ensureSymiModelsJson, _ as stripMinimaxToolCallXml, a as decodeDataUrl, b as stripReasoningTagsFromText, c as extractAssistantText$1, d as extractThinkingFromTaggedText, f as formatReasoningMessage, g as stripDowngradedToolCallText, h as promoteThinkingTagsToBlocks, i as coerceImageModelConfig, l as extractAssistantThinking, m as isAssistantMessage, o as resolveProviderVisionModelFromConfig, p as inferToolMetaFromArgs, r as coerceImageAssistantText, s as minimaxUnderstandImage, u as extractThinkingFromTaggedStream, v as stripThinkingTagsFromText, x as extractTextFromChatContent, y as resolveToolDisplay } from "./image-RLbZ3RUn.js";
41
41
  import { a as resolveAgentIdentity, i as resolveAckReaction, o as resolveEffectiveMessagesConfig, r as resolveResponsePrefixTemplate, s as resolveHumanDelayConfig, t as createReplyPrefixOptions } from "./reply-prefix-XlyuyChD.js";
42
42
  import { n as resolveMemorySearchConfig } from "./manager-B5EXdBQV.js";
43
43
  import { d as listMemoryFiles, f as normalizeExtraMemoryPaths, g as runTasksWithConcurrency } from "./sqlite-DRbx2dhW.js";
@@ -51,7 +51,7 @@ import { a as loadWebMedia, i as getDefaultLocalRoots } from "./ir-DccrnjsE.js";
51
51
  import { _ as resolveNativeCommandsEnabled, a as listChatCommandsForConfig, c as normalizeCommandBody, d as resolveCommandArgMenu, f as serializeCommandArgs, g as isRestartEnabled, h as isNativeCommandsExplicitlyDisabled, i as listChatCommands, l as parseCommandArgs, m as isCommandFlagEnabled, o as listNativeCommandSpecs, p as shouldHandleTextCommands, r as findCommandByNativeName, s as listNativeCommandSpecsForConfig, t as buildCommandTextFromArgs, u as resolveCommandArgChoices, v as resolveNativeSkillsEnabled } from "./commands-registry-C3C4Rv3O.js";
52
52
  import { c as getSkillsSnapshotVersion, d as createAsyncLock, f as readJsonFile, i as resolveSkillCommandInvocation, l as pruneExpiredPending, n as listSkillCommandsForAgents, o as getRemoteSkillEligibility, p as writeJsonAtomic, r as listSkillCommandsForWorkspace, s as ensureSkillsWatcher, t as listReservedChatSlashCommandNames, u as resolvePairingPaths } from "./skill-commands-B64uavY9.js";
53
53
  import { r as normalizeInboundTextNewlines, t as finalizeInboundContext } from "./inbound-context-BlHX0H3E.js";
54
- import { _ as resolveMediaUnderstandingScope, a as resolveMediaAttachmentLocalRoots, c as loadModelCatalog, d as resolveAttachmentKind, f as buildRandomTempFilePath, g as normalizeMediaUnderstandingChatType, h as resolveTimeoutMs$1, i as resolveAutoImageModel, l as modelSupportsVision, m as resolveConcurrency, n as createMediaAttachmentCache, o as runCapability, p as registerUnhandledRejectionHandler, r as normalizeMediaAttachments, s as findModelInCatalog, t as buildProviderRegistry, v as CLI_OUTPUT_MAX_BUFFER, y as applyTemplate } from "./runner-DOvsNiYz.js";
54
+ import { _ as resolveMediaUnderstandingScope, a as resolveMediaAttachmentLocalRoots, c as loadModelCatalog, d as resolveAttachmentKind, f as buildRandomTempFilePath, g as normalizeMediaUnderstandingChatType, h as resolveTimeoutMs$1, i as resolveAutoImageModel, l as modelSupportsVision, m as resolveConcurrency, n as createMediaAttachmentCache, o as runCapability, p as registerUnhandledRejectionHandler, r as normalizeMediaAttachments, s as findModelInCatalog, t as buildProviderRegistry, v as CLI_OUTPUT_MAX_BUFFER, y as applyTemplate } from "./runner-DjHRFXSI.js";
55
55
  import { n as wrapFetchWithAbortSignal, t as resolveFetch } from "./fetch-Bso4i15F.js";
56
56
  import { n as recordCommandPoll, r as resetCommandPollCount } from "./command-poll-backoff-Bup9wS1y.js";
57
57
  import { n as recordChannelActivity, r as createDiscordRetryRunner, t as getChannelActivity } from "./channel-activity-CsM_hJ_s.js";
@@ -81,7 +81,7 @@ import { EdgeTTS } from "node-edge-tts";
81
81
  import AjvPkg from "ajv";
82
82
  import { createServer } from "node:http";
83
83
  import { ProxyAgent, fetch as fetch$1 } from "undici";
84
- import WebSocket, { WebSocket as WebSocket$1 } from "ws";
84
+ import WebSocket$1, { WebSocket } from "ws";
85
85
  import { Buffer as Buffer$1 } from "node:buffer";
86
86
  import { createJiti } from "jiti";
87
87
  import { Type } from "@sinclair/typebox";
@@ -5715,7 +5715,7 @@ var GatewayClient = class {
5715
5715
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
5716
5716
  });
5717
5717
  }
5718
- this.ws = new WebSocket$1(url, wsOptions);
5718
+ this.ws = new WebSocket(url, wsOptions);
5719
5719
  this.ws.on("open", () => {
5720
5720
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
5721
5721
  const tlsError = this.validateTlsFingerprint();
@@ -5934,7 +5934,7 @@ var GatewayClient = class {
5934
5934
  return null;
5935
5935
  }
5936
5936
  async request(method, params, opts) {
5937
- if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
5937
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
5938
5938
  const id = randomUUID();
5939
5939
  const frame = {
5940
5940
  type: "req",
@@ -7200,7 +7200,7 @@ async function routeReply(params) {
7200
7200
  const resolvedReplyToId = replyToId ?? (channelId === "slack" && threadId != null && threadId !== "" ? String(threadId) : void 0);
7201
7201
  const resolvedThreadId = channelId === "slack" ? null : threadId ?? null;
7202
7202
  try {
7203
- const { deliverOutboundPayloads } = await import("./deliver-B3UoBZdC.js").then((n) => n.n);
7203
+ const { deliverOutboundPayloads } = await import("./deliver-DD3gs9SF.js").then((n) => n.n);
7204
7204
  return {
7205
7205
  ok: true,
7206
7206
  messageId: (await deliverOutboundPayloads({
@@ -41573,7 +41573,7 @@ async function deliverSessionMaintenanceWarning(params) {
41573
41573
  return;
41574
41574
  }
41575
41575
  try {
41576
- const { deliverOutboundPayloads } = await import("./deliver-B3UoBZdC.js").then((n) => n.n);
41576
+ const { deliverOutboundPayloads } = await import("./deliver-DD3gs9SF.js").then((n) => n.n);
41577
41577
  await deliverOutboundPayloads({
41578
41578
  cfg: params.cfg,
41579
41579
  channel,
@@ -45016,7 +45016,7 @@ async function describeStickerImage(params) {
45016
45016
  logVerbose(`telegram: describing sticker with ${provider}/${model}`);
45017
45017
  try {
45018
45018
  const buffer = await fs.readFile(imagePath);
45019
- const { describeImageWithModel } = await import("./image-RFofsrof.js").then((n) => n.n);
45019
+ const { describeImageWithModel } = await import("./image-RLbZ3RUn.js").then((n) => n.n);
45020
45020
  return (await describeImageWithModel({
45021
45021
  buffer,
45022
45022
  fileName: "sticker.webp",
@@ -47477,7 +47477,7 @@ async function preflightDiscordMessage(params) {
47477
47477
  let preflightTranscript;
47478
47478
  const hasAudioAttachment = message.attachments?.some((att) => att.contentType?.startsWith("audio/"));
47479
47479
  if (!isDirectMessage && shouldRequireMention && hasAudioAttachment && !baseText && mentionRegexes.length > 0) try {
47480
- const { transcribeFirstAudio } = await import("./audio-preflight-DRQD_nt1.js");
47480
+ const { transcribeFirstAudio } = await import("./audio-preflight-DbUFnPX1.js");
47481
47481
  const audioPaths = message.attachments?.filter((att) => att.contentType?.startsWith("audio/")).map((att) => att.url) ?? [];
47482
47482
  if (audioPaths.length > 0) preflightTranscript = await transcribeFirstAudio({
47483
47483
  ctx: {
@@ -51483,7 +51483,7 @@ function isVoiceChannelType(type) {
51483
51483
  function createDefaultDeps() {
51484
51484
  return {
51485
51485
  sendMessageWhatsApp: async (...args) => {
51486
- const { sendMessageWhatsApp } = await import("./web-BKQnrqo-.js");
51486
+ const { sendMessageWhatsApp } = await import("./web-0bP0TLM2.js");
51487
51487
  return await sendMessageWhatsApp(...args);
51488
51488
  },
51489
51489
  sendMessageTelegram: async (...args) => {
@@ -54387,7 +54387,7 @@ function createDiscordGatewayPlugin(params) {
54387
54387
  super(options);
54388
54388
  }
54389
54389
  createWebSocket(url) {
54390
- return new WebSocket(url, { agent });
54390
+ return new WebSocket$1(url, { agent });
54391
54391
  }
54392
54392
  }
54393
54393
  return new ProxyGatewayPlugin();
@@ -64605,7 +64605,7 @@ const buildTelegramMessageContext = async ({ primaryCtx, allMedia, storeAllowFro
64605
64605
  const hasAudio = allMedia.some((media) => media.contentType?.startsWith("audio/"));
64606
64606
  let preflightTranscript;
64607
64607
  if (isGroup && requireMention && hasAudio && !hasUserText && mentionRegexes.length > 0) try {
64608
- const { transcribeFirstAudio } = await import("./audio-preflight-DRQD_nt1.js");
64608
+ const { transcribeFirstAudio } = await import("./audio-preflight-DbUFnPX1.js");
64609
64609
  preflightTranscript = await transcribeFirstAudio({
64610
64610
  ctx: {
64611
64611
  MediaPaths: allMedia.length > 0 ? allMedia.map((m) => m.path) : void 0,
@@ -66762,7 +66762,7 @@ function loadWebLoginQr() {
66762
66762
  return webLoginQrPromise;
66763
66763
  }
66764
66764
  function loadWebChannel() {
66765
- webChannelPromise ??= import("./web-BKQnrqo-.js");
66765
+ webChannelPromise ??= import("./web-0bP0TLM2.js");
66766
66766
  return webChannelPromise;
66767
66767
  }
66768
66768
  function loadWhatsAppActions() {
@@ -12,7 +12,7 @@ import { c as SafeOpenError, i as getImageMetadata, l as openFileWithinRoot, n a
12
12
  import { S as isPidAlive, x as resolveProcessScopedMap } from "./model-auth-CeL58m55.js";
13
13
  import { o as listDeliverableMessageChannels, s as normalizeMessageChannel } from "./message-channel-Dz5lr5b0.js";
14
14
  import { _ as parseDurationMs, a as writeConfigFile, n as loadConfig, s as parseByteSize, t as createConfigIO } from "./config-DM0K7qC1.js";
15
- 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-LmEyZdbC.js";
15
+ 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-BATLK3yK.js";
16
16
  import { a as syncSkillsToWorkspace, l as resolveSandboxInputPath, m as sanitizeEnvVars, u as resolveSandboxPath } from "./skills-BFekKL7i.js";
17
17
  import { n as formatErrorMessage, t as extractErrorCode } from "./errors-BoQgnc8X.js";
18
18
  import { t as SsrFBlockedError } from "./ssrf-BTMDZjHT.js";
@@ -933,7 +933,7 @@ function isModuleNotFoundError(err) {
933
933
  }
934
934
  async function loadPwAiModule(mode) {
935
935
  try {
936
- return await import("./pw-ai-CAkn033M.js");
936
+ return await import("./pw-ai-CCt1nIO-.js");
937
937
  } catch (err) {
938
938
  if (mode === "soft") return null;
939
939
  if (isModuleNotFoundError(err)) return null;
@@ -3473,11 +3473,11 @@ function createProfileContext(opts, profile) {
3473
3473
  const userDataDir = resolveSymiUserDataDir(profile.name);
3474
3474
  const profileState = getProfileState();
3475
3475
  if (await isHttpReachable(300) && !profileState.running) try {
3476
- await (await import("./pw-ai-CAkn033M.js")).closePlaywrightBrowserConnection();
3476
+ await (await import("./pw-ai-CCt1nIO-.js")).closePlaywrightBrowserConnection();
3477
3477
  } catch {}
3478
3478
  if (profileState.running) await stopRunningBrowser();
3479
3479
  try {
3480
- await (await import("./pw-ai-CAkn033M.js")).closePlaywrightBrowserConnection();
3480
+ await (await import("./pw-ai-CCt1nIO-.js")).closePlaywrightBrowserConnection();
3481
3481
  } catch {}
3482
3482
  if (!fs$1.existsSync(userDataDir)) return {
3483
3483
  moved: false,
@@ -9,7 +9,7 @@ import "./model-auth-CeL58m55.js";
9
9
  import "./github-copilot-token-C_qUP7p5.js";
10
10
  import "./config-DM0K7qC1.js";
11
11
  import "./manifest-registry-D0IQ3WuX.js";
12
- import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-LmEyZdbC.js";
12
+ import { _ as fetchJson, b as withCdpSocket, d as normalizeCdpWsUrl, g as appendCdpPath, h as withBrowserNavigationPolicy, m as assertBrowserNavigationAllowed, t as getChromeWebSocketUrl, u as formatAriaSnapshot, y as getHeadersWithAuth } from "./chrome-BATLK3yK.js";
13
13
  import "./redact-jSxx6Ep2.js";
14
14
  import { n as formatErrorMessage } from "./errors-BoQgnc8X.js";
15
15
  import "./ssrf-BTMDZjHT.js";
@@ -4,7 +4,7 @@ import { t as normalizeChatType } from "./chat-type-C_KiWNAH.js";
4
4
  import { _ as kindFromMime, d as detectMime, h as isAudioFileName, p as getFileExtension } from "./image-ops-CvJzsyvE.js";
5
5
  import { A as normalizeProviderId, L as normalizeGoogleModelId, i as resolveApiKeyForProvider, r as requireApiKey, y as resolveSymiAgentDir } from "./model-auth-CeL58m55.js";
6
6
  import { d as DEFAULT_IMESSAGE_ATTACHMENT_ROOTS, f as isInboundPathAllowed, m as resolveIMessageAttachmentRoots, n as loadConfig, p as mergeInboundPathRoots } from "./config-DM0K7qC1.js";
7
- import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-RFofsrof.js";
7
+ import { S as ensureSymiModelsJson, t as describeImageWithModel } from "./image-RLbZ3RUn.js";
8
8
  import { n as collectProviderApiKeysForExecution, r as executeWithApiKeyRotation, t as parseGeminiAuth } from "./gemini-auth-7AWT6JXV.js";
9
9
  import { n as fetchWithTimeout } from "./fetch-timeout-DL3f_O53.js";
10
10
  import { i as fetchRemoteMedia, n as getDefaultMediaLocalRoots, o as fetchWithSsrFGuard, r as MediaFetchError } from "./local-roots-DMwIh5cS.js";
@@ -5,7 +5,7 @@ import "./agent-scope-BxoUQqgM.js";
5
5
  import { r as defaultRuntime, t as createSubsystemLogger } from "./subsystem-Bs9YvKLa.js";
6
6
  import "./workspace-wAaHI8-5.js";
7
7
  import "./tokens-H1H1LiSQ.js";
8
- import { C as resolveEnvelopeFormatOptions, D as normalizeMentionText, E as buildMentionRegexes, S as formatInboundEnvelope, T as shouldComputeCommandAuthorized, _ as parseActivationCommand, b as createInboundDebouncer, c as DEFAULT_GROUP_HISTORY_LIMIT, d as shouldAckReactionForWhatsApp, f as dispatchReplyWithBufferedBlockDispatcher, g as normalizeGroupActivation, h as getReplyFromConfig, l as buildHistoryContextFromEntries, m as createDedupeCache, n as computeBackoff, o as buildPairingReply, r as sleepWithAbort, s as resolveMentionGating, u as recordPendingHistoryEntryIfEnabled, v as formatDurationPrecise, w as hasControlCommand, x as resolveInboundDebounceMs, y as enqueueSystemEvent } from "./pi-embedded-BjzaB3CT.js";
8
+ import { C as resolveEnvelopeFormatOptions, D as normalizeMentionText, E as buildMentionRegexes, S as formatInboundEnvelope, T as shouldComputeCommandAuthorized, _ as parseActivationCommand, b as createInboundDebouncer, c as DEFAULT_GROUP_HISTORY_LIMIT, d as shouldAckReactionForWhatsApp, f as dispatchReplyWithBufferedBlockDispatcher, g as normalizeGroupActivation, h as getReplyFromConfig, l as buildHistoryContextFromEntries, m as createDedupeCache, n as computeBackoff, o as buildPairingReply, r as sleepWithAbort, s as resolveMentionGating, u as recordPendingHistoryEntryIfEnabled, v as formatDurationPrecise, w as hasControlCommand, x as resolveInboundDebounceMs, y as enqueueSystemEvent } from "./pi-embedded-ZzUH4ioO.js";
9
9
  import "./plugins-DQYI3Fr-.js";
10
10
  import { i as logWebSelfId, l as readWebSelfId, n as WA_WEB_AUTH_DIR, p as webAuthExists, r as getWebAuthAgeMs, s as pickWebChannel, t as resolveWhatsAppAccount } from "./accounts-tNElYrCH.js";
11
11
  import "./boolean-B8-BqKGQ.js";
@@ -13,7 +13,7 @@ import { t as formatCliCommand } from "./command-format-BaxDnULz.js";
13
13
  import "./bindings-B7Ke6LJi.js";
14
14
  import "./send-CHOArYFe.js";
15
15
  import "./send-D3M6pMr5.js";
16
- import "./deliver-B3UoBZdC.js";
16
+ import "./deliver-DD3gs9SF.js";
17
17
  import "./diagnostic-CI0kRQkt.js";
18
18
  import "./diagnostic-session-state-Bxo4UHOL.js";
19
19
  import "./accounts-CWktKM8a.js";
@@ -23,10 +23,10 @@ import "./model-auth-CeL58m55.js";
23
23
  import "./github-copilot-token-C_qUP7p5.js";
24
24
  import "./pi-model-discovery-DaNAekda.js";
25
25
  import "./message-channel-Dz5lr5b0.js";
26
- import { Ct as resolveGroupSessionKey, G as updateLastRoute, H as loadSessionStore, U as readSessionUpdatedAt, W as recordSessionMetaFromInbound } from "./pi-embedded-helpers-kB5lBgXk.js";
26
+ import { Ct as resolveGroupSessionKey, G as updateLastRoute, H as loadSessionStore, U as readSessionUpdatedAt, W as recordSessionMetaFromInbound } from "./pi-embedded-helpers-x8rJur4F.js";
27
27
  import { n as loadConfig } from "./config-DM0K7qC1.js";
28
28
  import "./manifest-registry-D0IQ3WuX.js";
29
- import "./chrome-LmEyZdbC.js";
29
+ import "./chrome-BATLK3yK.js";
30
30
  import "./frontmatter-C_bv_0P8.js";
31
31
  import "./skills-BFekKL7i.js";
32
32
  import "./redact-jSxx6Ep2.js";
@@ -37,7 +37,7 @@ import { h as resolveChannelGroupRequireMention, m as resolveChannelGroupPolicy
37
37
  import "./accounts-qtxJ-6em.js";
38
38
  import { s as resolveStorePath } from "./paths-DLyHUt31.js";
39
39
  import "./tool-images-DXB7tqWi.js";
40
- import "./image-RFofsrof.js";
40
+ import "./image-RLbZ3RUn.js";
41
41
  import { c as resolveIdentityNamePrefix, l as resolveMessagePrefix, t as createReplyPrefixOptions } from "./reply-prefix-XlyuyChD.js";
42
42
  import "./manager-B5EXdBQV.js";
43
43
  import "./gemini-auth-7AWT6JXV.js";
@@ -52,7 +52,7 @@ import "./render-CDCvpfhh.js";
52
52
  import "./commands-registry-C3C4Rv3O.js";
53
53
  import "./skill-commands-B64uavY9.js";
54
54
  import { t as finalizeInboundContext } from "./inbound-context-BlHX0H3E.js";
55
- import { p as registerUnhandledRejectionHandler } from "./runner-DOvsNiYz.js";
55
+ import { p as registerUnhandledRejectionHandler } from "./runner-DjHRFXSI.js";
56
56
  import "./fetch-Bso4i15F.js";
57
57
  import { n as recordChannelActivity } from "./channel-activity-CsM_hJ_s.js";
58
58
  import { t as convertMarkdownTables } from "./tables-DuZspiBu.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symerian/symi",
3
- "version": "2.0.11",
3
+ "version": "2.0.13",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/jaysteelmind/symi#readme",