@symerian/symi 2.0.11 → 2.0.12

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.12",
3
+ "commit": "836b23c66e3fc139ac5c7db44a43adea9ec35b22",
4
+ "builtAt": "2026-03-09T16:39:28.949Z"
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
+ 2fb661e40a01af0991c00286ee43d4cbc9c8f6b1cc4459500dd5826143402576
@@ -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,6 +246,10 @@ 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) {
@@ -301,9 +308,18 @@ function handleGatewayEvent(event) {
301
308
  if (text) {
302
309
  updateStream(text);
303
310
  }
311
+ // Stream thinking deltas live to the Reasoning Panel
312
+ const thinkingText =
313
+ typeof window.extractThinkingText === "function" ? window.extractThinkingText(p.message) : "";
314
+ if (thinkingText && typeof window.updateLiveThinking === "function") {
315
+ window.updateLiveThinking(thinkingText);
316
+ }
304
317
  } else if (p.state === "final") {
305
318
  stopElapsedTimer();
306
319
  clearWatchdog();
320
+ if (typeof window.closeLiveThinking === "function") {
321
+ window.closeLiveThinking();
322
+ }
307
323
  closeStreamBubble();
308
324
  setAgentStatus("done");
309
325
  isStreaming = false;
@@ -316,6 +332,9 @@ function handleGatewayEvent(event) {
316
332
  // Clean abort (user-initiated or model decided to stop) — not an error
317
333
  stopElapsedTimer();
318
334
  clearWatchdog();
335
+ if (typeof window.closeLiveThinking === "function") {
336
+ window.closeLiveThinking();
337
+ }
319
338
  if (streamBubble) {
320
339
  closeStreamBubble();
321
340
  }
@@ -371,6 +390,13 @@ function setAgentStatus(key) {
371
390
  asoSub.textContent = s.sub;
372
391
  }
373
392
 
393
+ // Pulse the reasoning live-dot while agent is actively thinking/streaming
394
+ const reasoningDot = document.getElementById("reasoning-live-dot");
395
+ if (reasoningDot) {
396
+ const active = key === "thinking" || key === "streaming" || key === "waiting";
397
+ reasoningDot.classList.toggle("active", active);
398
+ }
399
+
374
400
  // ── Elapsed timer management ──────────────────────────────────
375
401
  if (key === "thinking") {
376
402
  // Start elapsed timer and watchdog when processing begins
@@ -476,6 +502,11 @@ async function sendText(text) {
476
502
  addUserMessage(text);
477
503
  await sleep(200);
478
504
 
505
+ // Mark the start of this run in the Reasoning Panel
506
+ if (typeof window.injectReasoningRunSeparator === "function") {
507
+ window.injectReasoningRunSeparator();
508
+ }
509
+
479
510
  setAgentStatus("waiting");
480
511
  thinkingEl = createThinkingBubble();
481
512
  setAgentStatus("thinking");
@@ -532,6 +563,9 @@ async function handleNewSession() {
532
563
 
533
564
  responseArea.innerHTML = "";
534
565
  responseArea.style.opacity = "1";
566
+ if (typeof window.clearReasoningPanel === "function") {
567
+ window.clearReasoningPanel();
568
+ }
535
569
 
536
570
  // Show empty-state indicator
537
571
  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,9 +733,15 @@ 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);
@@ -3,7 +3,7 @@ import fs from "node:fs";
3
3
  import os from "node:os";
4
4
  import path from "node:path";
5
5
  import { Logger } from "tslog";
6
- import JSON5 from "json5";
6
+ import json5 from "json5";
7
7
  import chalk, { Chalk } from "chalk";
8
8
  import fs$1 from "node:fs/promises";
9
9
  import { execFile, execFileSync, spawn } from "node:child_process";
@@ -291,7 +291,7 @@ function readLoggingConfig() {
291
291
  try {
292
292
  if (!fs.existsSync(configPath)) return;
293
293
  const raw = fs.readFileSync(configPath, "utf-8");
294
- const logging = JSON5.parse(raw)?.logging;
294
+ const logging = json5.parse(raw)?.logging;
295
295
  if (!logging || typeof logging !== "object" || Array.isArray(logging)) return;
296
296
  return logging;
297
297
  } catch {
@@ -3063,7 +3063,7 @@ function safeRealpath(target) {
3063
3063
  }
3064
3064
  const defaultResolver = {
3065
3065
  readFile: (p) => fs.readFileSync(p, "utf-8"),
3066
- parseJson: (raw) => JSON5.parse(raw)
3066
+ parseJson: (raw) => json5.parse(raw)
3067
3067
  };
3068
3068
  /**
3069
3069
  * Resolves all $include directives in a parsed config object.
@@ -8346,7 +8346,7 @@ function resolveConfigPathForDeps(deps) {
8346
8346
  function normalizeDeps(overrides = {}) {
8347
8347
  return {
8348
8348
  fs: overrides.fs ?? fs,
8349
- json5: overrides.json5 ?? JSON5,
8349
+ json5: overrides.json5 ?? json5,
8350
8350
  env: overrides.env ?? process.env,
8351
8351
  homedir: overrides.homedir ?? (() => resolveRequiredHomeDir(overrides.env ?? process.env, os.homedir)),
8352
8352
  configPath: overrides.configPath ?? "",
@@ -8357,11 +8357,11 @@ function maybeLoadDotEnvForConfig(env) {
8357
8357
  if (env !== process.env) return;
8358
8358
  loadDotEnv({ quiet: true });
8359
8359
  }
8360
- function parseConfigJson5(raw, json5 = JSON5) {
8360
+ function parseConfigJson5(raw, json5$1 = json5) {
8361
8361
  try {
8362
8362
  return {
8363
8363
  ok: true,
8364
- parsed: json5.parse(raw)
8364
+ parsed: json5$1.parse(raw)
8365
8365
  };
8366
8366
  } catch (err) {
8367
8367
  return {
@@ -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.12",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/jaysteelmind/symi#readme",