@symerian/symi 3.5.2 → 3.5.4

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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.5.2",
3
- "commit": "bea296bd99d5504ad42b2e59fe77c129f62e58f8",
4
- "builtAt": "2026-05-04T16:54:57.938Z"
2
+ "version": "3.5.4",
3
+ "commit": "0397814c6e20d7520e243d91233b9d57cc255628",
4
+ "builtAt": "2026-05-05T00:35:18.057Z"
5
5
  }
@@ -4,16 +4,16 @@ import { E as shouldLogVerbose, G as isRecord, r as DEFAULT_CHAT_CHANNEL, v as i
4
4
  import { a as resolveAgentSkillsFilter, c as resolveEffectiveModelFallbacks, i as resolveAgentModelPrimary, l as resolveSessionAgentId, o as resolveAgentWorkspaceDir, r as resolveAgentDir, t as listAgentIds, u as resolveSessionAgentIds } from "../../agent-scope-B1Ina6jV.js";
5
5
  import { r as defaultRuntime, t as createSubsystemLogger } from "../../subsystem-DzRUKS9f.js";
6
6
  import { l as ensureAgentWorkspace } from "../../workspace-CsaDUuDn.js";
7
- import { A as runWithModelFallback, C as resolveSymiDocsPath, D as resolveRunWorkspaceDir, E as redactRunIdentifier, M as resolveFailoverStatus, O as deriveSessionTotalTokens, S as buildAgentSystemPrompt, T as resolveBootstrapContextForRun, _ as AGENT_LANE_NESTED, a as resolveSessionDeliveryTarget, b as emitAgentEvent, c as detectRuntimeShell, d as applyModelOverrideToSessionEntry, f as applyVerboseOverride, g as resolveAgentTimeoutMs, i as resolveOutboundTarget, j as FailoverError, k as hasNonzeroUsage, l as resolveSendPolicy, m as clearSessionAuthProfileOverride, n as buildModelAliasLines, o as buildSystemPromptParams, p as loadModelCatalog, s as getProcessSupervisor, t as runAgentTurn, u as lookupContextTokens, v as AGENT_LANE_SUBAGENT, w as makeBootstrapWarn, x as registerAgentRunContext, y as clearAgentRunContext } from "../../unified-runner-BVvvnjXW.js";
7
+ import { A as runWithModelFallback, C as resolveSymiDocsPath, D as resolveRunWorkspaceDir, E as redactRunIdentifier, M as resolveFailoverStatus, O as deriveSessionTotalTokens, S as buildAgentSystemPrompt, T as resolveBootstrapContextForRun, _ as AGENT_LANE_NESTED, a as resolveSessionDeliveryTarget, b as emitAgentEvent, c as detectRuntimeShell, d as applyModelOverrideToSessionEntry, f as applyVerboseOverride, g as resolveAgentTimeoutMs, i as resolveOutboundTarget, j as FailoverError, k as hasNonzeroUsage, l as resolveSendPolicy, m as clearSessionAuthProfileOverride, n as buildModelAliasLines, o as buildSystemPromptParams, p as loadModelCatalog, s as getProcessSupervisor, t as runAgentTurn, u as lookupContextTokens, v as AGENT_LANE_SUBAGENT, w as makeBootstrapWarn, x as registerAgentRunContext, y as clearAgentRunContext } from "../../unified-runner-BIiKFnNF.js";
8
8
  import { d as ensureAuthProfileStore } from "../../auth-profiles-BSw0aQND.js";
9
9
  import { t as formatCliCommand } from "../../command-format-BrrHNE8r.js";
10
10
  import { _ as DEFAULT_MODEL, a as isCliProvider, c as normalizeProviderId, d as resolveDefaultModelForAgent, g as DEFAULT_CONTEXT_TOKENS, m as resolveThinkingDefault, o as modelKey, s as normalizeModelRef, t as buildAllowedModelSet, u as resolveConfiguredModelRef, v as DEFAULT_PROVIDER } from "../../model-selection-BqshlIZc.js";
11
- import { At as resolveSessionResetPolicy, Dt as resolveSessionKey, It as resolveAgentMainSessionKey, Lt as resolveExplicitAgentSessionKey, M as classifyFailoverReason, Ot as evaluateSessionFreshness, Rt as resolveMainSessionKey, U as isFailoverErrorMessage, a as normalizeOutboundPayloadsForJson, at as loadSessionStore, i as normalizeOutboundPayloads, it as resolveAndPersistSessionFile, jt as resolveSessionResetType, kt as resolveChannelResetConfig, lt as updateSessionStore, nt as parseSessionThreadInfo, r as formatOutboundPayloadLog, t as deliverOutboundPayloads, vt as normalizeAccountId } from "../../deliver-DTRkeYm3.js";
11
+ import { At as resolveSessionResetPolicy, Dt as resolveSessionKey, It as resolveAgentMainSessionKey, Lt as resolveExplicitAgentSessionKey, M as classifyFailoverReason, Ot as evaluateSessionFreshness, Rt as resolveMainSessionKey, U as isFailoverErrorMessage, a as normalizeOutboundPayloadsForJson, at as loadSessionStore, i as normalizeOutboundPayloads, it as resolveAndPersistSessionFile, jt as resolveSessionResetType, kt as resolveChannelResetConfig, lt as updateSessionStore, nt as parseSessionThreadInfo, r as formatOutboundPayloadLog, t as deliverOutboundPayloads, vt as normalizeAccountId } from "../../deliver-DyO3QD8O.js";
12
12
  import { c as loadConfig } from "../../ssrf-oI58TMOb.js";
13
13
  import "../../boolean-BsqeuxE6.js";
14
14
  import { s as isTruthyEnvValue } from "../../shell-env-B1lDWz4t.js";
15
15
  import "../../manifest-registry-BGJu2aC-.js";
16
- import "../../chrome-DPjznJQ-.js";
16
+ import "../../chrome-C_I81hbq.js";
17
17
  import "../../frontmatter-CJEX1BrH.js";
18
18
  import { n as buildWorkspaceSkillSnapshot } from "../../skills-Dm4gX4Tl.js";
19
19
  import "../../redact-CSGZUFxa.js";
@@ -27,7 +27,7 @@ import { i as resolveSessionTranscriptPath, n as resolveSessionFilePath, s as re
27
27
  import { t as SILENT_REPLY_TOKEN } from "../../tokens-D_vCJSzF.js";
28
28
  import "../../diagnostic-BALvP9wI.js";
29
29
  import "../../diagnostic-session-state-BDfanaOY.js";
30
- import "../../manager-CsxTf96V.js";
30
+ import "../../manager-PTSjHNVq.js";
31
31
  import "../../github-copilot-token-uhEBNQfj.js";
32
32
  import "../../pi-auth-json-DCGR3yfh.js";
33
33
  import "../../reply-prefix-D0NzzC4I.js";
@@ -4,15 +4,15 @@ import "../../registry-C-JddWwo.js";
4
4
  import { o as resolveAgentWorkspaceDir } from "../../agent-scope-B1Ina6jV.js";
5
5
  import { t as createSubsystemLogger } from "../../subsystem-DzRUKS9f.js";
6
6
  import "../../workspace-CsaDUuDn.js";
7
- import "../../unified-runner-BVvvnjXW.js";
7
+ import "../../unified-runner-BIiKFnNF.js";
8
8
  import "../../auth-profiles-BSw0aQND.js";
9
9
  import "../../model-selection-BqshlIZc.js";
10
- import { Tt as hasInterSessionUserProvenance } from "../../deliver-DTRkeYm3.js";
10
+ import { Tt as hasInterSessionUserProvenance } from "../../deliver-DyO3QD8O.js";
11
11
  import "../../ssrf-oI58TMOb.js";
12
12
  import "../../boolean-BsqeuxE6.js";
13
13
  import "../../shell-env-B1lDWz4t.js";
14
14
  import "../../manifest-registry-BGJu2aC-.js";
15
- import "../../chrome-DPjznJQ-.js";
15
+ import "../../chrome-C_I81hbq.js";
16
16
  import "../../frontmatter-CJEX1BrH.js";
17
17
  import "../../skills-Dm4gX4Tl.js";
18
18
  import "../../redact-CSGZUFxa.js";
@@ -26,7 +26,7 @@ import "../../paths-BsT3BvfH.js";
26
26
  import "../../tokens-D_vCJSzF.js";
27
27
  import "../../diagnostic-BALvP9wI.js";
28
28
  import "../../diagnostic-session-state-BDfanaOY.js";
29
- import "../../manager-CsxTf96V.js";
29
+ import "../../manager-PTSjHNVq.js";
30
30
  import "../../github-copilot-token-uhEBNQfj.js";
31
31
  import "../../pi-auth-json-DCGR3yfh.js";
32
32
  import "../../reply-prefix-D0NzzC4I.js";
@@ -1 +1 @@
1
- 9dc8e06b141f490369cad20ef65e9bbc536b2adf8291a57bc364e733d9c34f23
1
+ 5ee3d5340dddf150c007fc3a6affaca8c1e3fdaa096547286ef5608318124868
@@ -1,7 +1,7 @@
1
- import { z as CONFIG_DIR } from "./registry-C-JddWwo.js";
2
- import { t as createSubsystemLogger } from "./subsystem-DzRUKS9f.js";
3
- import { a as resolvePinnedHostnameWithPolicy, c as loadConfig } from "./ssrf-oI58TMOb.js";
4
- import { r as isErrno } from "./errors-C89ppfp9.js";
1
+ import { I as CONFIG_DIR } from "./registry-CANRzFn-.js";
2
+ import { t as createSubsystemLogger } from "./subsystem-Bzq1QhtO.js";
3
+ import { a as resolvePinnedHostnameWithPolicy, c as loadConfig } from "./ssrf-q6hBiAOi.js";
4
+ import { r as isErrno } from "./errors-BEU7IHU6.js";
5
5
  import path from "node:path";
6
6
  import fs from "node:fs";
7
7
  import os from "node:os";
@@ -1,7 +1,7 @@
1
- import { I as CONFIG_DIR } from "./registry-CANRzFn-.js";
2
- import { t as createSubsystemLogger } from "./subsystem-Bzq1QhtO.js";
3
- import { a as resolvePinnedHostnameWithPolicy, c as loadConfig } from "./ssrf-q6hBiAOi.js";
4
- import { r as isErrno } from "./errors-BEU7IHU6.js";
1
+ import { z as CONFIG_DIR } from "./registry-C-JddWwo.js";
2
+ import { t as createSubsystemLogger } from "./subsystem-DzRUKS9f.js";
3
+ import { a as resolvePinnedHostnameWithPolicy, c as loadConfig } from "./ssrf-oI58TMOb.js";
4
+ import { r as isErrno } from "./errors-C89ppfp9.js";
5
5
  import path from "node:path";
6
6
  import fs from "node:fs";
7
7
  import os from "node:os";
@@ -284,8 +284,12 @@
284
284
  <option value="spider-qwen35-uncen">Qwen 3.5 Uncensored</option>
285
285
  <option value="spider-qwen36">Qwen 3.6 35B</option>
286
286
  </select>
287
- <button class="model-toggle-btn" data-model="redsand">CoreWeave</button>
288
- <button class="model-toggle-btn" data-model="coreweave2">Coreweave2</button>
287
+ <select class="model-toggle-select" id="model-toggle-coreweave" data-model="coreweave">
288
+ <option value="" disabled selected>CoreWeave ▾</option>
289
+ <option value="coreweave1">CoreWeave 1 (Qwen 3.5 35B)</option>
290
+ <option value="coreweave2">CoreWeave 2 (Qwen 3.6 35B)</option>
291
+ <option value="coreweave3">CoreWeave 3 (Qwen 3.6 27B)</option>
292
+ </select>
289
293
  <button class="model-toggle-btn" data-model="api">API</button>
290
294
  </div>
291
295
  <div class="model-status" id="model-status">loading…</div>
@@ -1,13 +1,12 @@
1
1
  // ── Model Routing Toggle ─────────────────────────────────────────────
2
- // Spider dropdown (4 models) ↔ CoreWeave (Qwen vLLM) ↔ API (Anthropic).
3
- // The Spider dropdown is a single <select> that maps each option value
4
- // (the provider key) to a fully-qualified model id.
2
+ // Spider dropdown (4 models) ↔ CoreWeave dropdown (3 endpoints) ↔ API (Anthropic).
3
+ // Each <select> maps an option value (the provider key) to a fully
4
+ // qualified model id; clicking switches `agents.defaults.model.primary`
5
+ // via config.patch.
5
6
 
6
7
  (function () {
7
- // Button keys → full model id
8
+ // Button keys → full model id (single-button surfaces)
8
9
  const BUTTON_MODELS = {
9
- redsand: "qwen-cw/qwen35-35b-fp8",
10
- coreweave2: "qwen-cw2/qwen36-35b-fp8",
11
10
  api: "anthropic/claude-sonnet-4-6",
12
11
  };
13
12
 
@@ -23,17 +22,27 @@
23
22
  "spider-qwen36": "spider-qwen36/Qwen/Qwen3.6-35B-A3B-FP8",
24
23
  };
25
24
 
25
+ // CoreWeave option values → full model id. Same shape as SPIDER_MODELS;
26
+ // each entry corresponds to a provider block in symi.json
27
+ // (qwen-cw / qwen-cw2 / qwen-cw3) all hosted at *.coreweave.app.
28
+ const COREWEAVE_MODELS = {
29
+ coreweave1: "qwen-cw/qwen35-35b-fp8",
30
+ coreweave2: "qwen-cw2/qwen36-35b-fp8",
31
+ coreweave3: "qwen-cw3/qwen36-27b-fp8",
32
+ };
33
+
26
34
  const buttons = document.querySelectorAll("#model-toggle .model-toggle-btn");
27
35
  const spiderSelect = document.getElementById("model-toggle-spider");
36
+ const coreweaveSelect = document.getElementById("model-toggle-coreweave");
28
37
  const statusEl = document.getElementById("model-status");
29
38
 
30
- if (!buttons.length && !spiderSelect) {
39
+ if (!buttons.length && !spiderSelect && !coreweaveSelect) {
31
40
  return;
32
41
  }
33
42
 
34
43
  let currentHash = null;
35
44
 
36
- // Reverse lookups: model id → (button key | spider option value)
45
+ // Reverse lookups: model id → option value, per surface
37
46
  const idToButtonKey = {};
38
47
  for (const [key, id] of Object.entries(BUTTON_MODELS)) {
39
48
  idToButtonKey[id] = key;
@@ -42,6 +51,10 @@
42
51
  for (const [key, id] of Object.entries(SPIDER_MODELS)) {
43
52
  idToSpiderKey[id] = key;
44
53
  }
54
+ const idToCoreweaveKey = {};
55
+ for (const [key, id] of Object.entries(COREWEAVE_MODELS)) {
56
+ idToCoreweaveKey[id] = key;
57
+ }
45
58
 
46
59
  function setActive(primaryId) {
47
60
  const buttonKey = idToButtonKey[primaryId];
@@ -52,9 +65,14 @@
52
65
  const spiderKey = idToSpiderKey[primaryId];
53
66
  if (spiderSelect) {
54
67
  spiderSelect.classList.toggle("active", Boolean(spiderKey));
55
- // Reset to the placeholder when the active model isn't a Spider one
56
68
  spiderSelect.value = spiderKey ?? "";
57
69
  }
70
+
71
+ const coreweaveKey = idToCoreweaveKey[primaryId];
72
+ if (coreweaveSelect) {
73
+ coreweaveSelect.classList.toggle("active", Boolean(coreweaveKey));
74
+ coreweaveSelect.value = coreweaveKey ?? "";
75
+ }
58
76
  }
59
77
 
60
78
  async function init() {
@@ -131,6 +149,15 @@
131
149
  });
132
150
  }
133
151
 
152
+ if (coreweaveSelect) {
153
+ coreweaveSelect.addEventListener("change", () => {
154
+ const id = COREWEAVE_MODELS[coreweaveSelect.value];
155
+ if (id) {
156
+ void switchToModelId(id);
157
+ }
158
+ });
159
+ }
160
+
134
161
  window.addEventListener("gateway:connected", () => init());
135
162
  if (window.gateway && window.gateway.connected) {
136
163
  void init();
@@ -9,7 +9,7 @@ import { r as normalizeChannelId, t as getChannelPlugin } from "./plugins-CZ_mYw
9
9
  import { _ as listDeliverableMessageChannels, c as resolveChunkMode, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, n as chunkByParagraph, v as normalizeMessageChannel } from "./chunk-CAZujdOi.js";
10
10
  import { c as loadConfig, d as writeConfigFile, m as parseByteSize, p as parseDurationMs, s as createConfigIO, t as SsrFBlockedError } from "./ssrf-q6hBiAOi.js";
11
11
  import { t as parseBooleanValue } from "./boolean-BW6OTjPi.js";
12
- import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-B7-rO4i9.js";
12
+ import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-BKUACyeO.js";
13
13
  import { t as formatCliCommand } from "./command-format-DPd9RN2g.js";
14
14
  import { a as syncSkillsToWorkspace, l as resolveSandboxInputPath, m as sanitizeEnvVars, u as resolveSandboxPath } from "./skills-DO7WNsVJ.js";
15
15
  import { n as formatErrorMessage, t as extractErrorCode } from "./errors-BEU7IHU6.js";
@@ -1331,7 +1331,7 @@ function isModuleNotFoundError(err) {
1331
1331
  }
1332
1332
  async function loadPwAiModule(mode) {
1333
1333
  try {
1334
- return await import("./pw-ai-BOOB8qoi.js");
1334
+ return await import("./pw-ai-BFS9ezWe.js");
1335
1335
  } catch (err) {
1336
1336
  if (mode === "soft") return null;
1337
1337
  if (isModuleNotFoundError(err)) return null;
@@ -3928,11 +3928,11 @@ function createProfileContext(opts, profile) {
3928
3928
  const userDataDir = resolveSymiUserDataDir(profile.name);
3929
3929
  const profileState = getProfileState();
3930
3930
  if (await isHttpReachable(300) && !profileState.running) try {
3931
- await (await import("./pw-ai-BOOB8qoi.js")).closePlaywrightBrowserConnection();
3931
+ await (await import("./pw-ai-BFS9ezWe.js")).closePlaywrightBrowserConnection();
3932
3932
  } catch {}
3933
3933
  if (profileState.running) await stopRunningBrowser();
3934
3934
  try {
3935
- await (await import("./pw-ai-BOOB8qoi.js")).closePlaywrightBrowserConnection();
3935
+ await (await import("./pw-ai-BFS9ezWe.js")).closePlaywrightBrowserConnection();
3936
3936
  } catch {}
3937
3937
  if (!fs.existsSync(userDataDir)) return {
3938
3938
  moved: false,
@@ -9,7 +9,7 @@ import { t as formatCliCommand } from "./command-format-BrrHNE8r.js";
9
9
  import { n as isPidAlive, t as resolveProcessScopedMap } from "./process-scoped-map-B-dHc_9I.js";
10
10
  import { c as loadConfig, d as writeConfigFile, m as parseByteSize, p as parseDurationMs, s as createConfigIO, t as SsrFBlockedError } from "./ssrf-oI58TMOb.js";
11
11
  import { t as parseBooleanValue } from "./boolean-BsqeuxE6.js";
12
- import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-DPjznJQ-.js";
12
+ import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-C_I81hbq.js";
13
13
  import { a as syncSkillsToWorkspace, l as resolveSandboxInputPath, m as sanitizeEnvVars, u as resolveSandboxPath } from "./skills-Dm4gX4Tl.js";
14
14
  import { n as formatErrorMessage, t as extractErrorCode } from "./errors-C89ppfp9.js";
15
15
  import { b as SafeOpenError, d as extensionForMime, i as buildImageResizeSideGrid, l as resizeToJpeg, o as getImageMetadata, r as IMAGE_REDUCE_QUALITY_STEPS, t as getAgentScopedMediaLocalRoots, u as detectMime, x as openFileWithinRoot } from "./local-roots-C7fBKoOI.js";
@@ -939,7 +939,7 @@ function isModuleNotFoundError(err) {
939
939
  }
940
940
  async function loadPwAiModule(mode) {
941
941
  try {
942
- return await import("./pw-ai-D2pEVS5n.js");
942
+ return await import("./pw-ai-Cx-Ko_FL.js");
943
943
  } catch (err) {
944
944
  if (mode === "soft") return null;
945
945
  if (isModuleNotFoundError(err)) return null;
@@ -3536,11 +3536,11 @@ function createProfileContext(opts, profile) {
3536
3536
  const userDataDir = resolveSymiUserDataDir(profile.name);
3537
3537
  const profileState = getProfileState();
3538
3538
  if (await isHttpReachable(300) && !profileState.running) try {
3539
- await (await import("./pw-ai-D2pEVS5n.js")).closePlaywrightBrowserConnection();
3539
+ await (await import("./pw-ai-Cx-Ko_FL.js")).closePlaywrightBrowserConnection();
3540
3540
  } catch {}
3541
3541
  if (profileState.running) await stopRunningBrowser();
3542
3542
  try {
3543
- await (await import("./pw-ai-D2pEVS5n.js")).closePlaywrightBrowserConnection();
3543
+ await (await import("./pw-ai-Cx-Ko_FL.js")).closePlaywrightBrowserConnection();
3544
3544
  } catch {}
3545
3545
  if (!fs.existsSync(userDataDir)) return {
3546
3546
  moved: false,
@@ -6,8 +6,8 @@ import { _ as DEFAULT_PROVIDER, g as DEFAULT_MODEL, p as resolveThinkingDefault
6
6
  import { a as resolveAgentIdentity } from "./reply-prefix-i-FPYcoQ.js";
7
7
  import "./plugins-CZ_mYwXq.js";
8
8
  import "./replies-BYF1gbJf.js";
9
- import { a as resolveAgentTimeoutMs, r as runEmbeddedPiAgent } from "./pi-embedded-Cdub5Vs9.js";
10
- import { $ as loadSessionStore, nt as saveSessionStore } from "./deliver-oWGJwzFf.js";
9
+ import { a as resolveAgentTimeoutMs, r as runEmbeddedPiAgent } from "./pi-embedded-BPuUM-gD.js";
10
+ import { $ as loadSessionStore, nt as saveSessionStore } from "./deliver-Cjyb6h4g.js";
11
11
  import "./diagnostic-BdRnGknC.js";
12
12
  import "./diagnostic-session-state-DpxCUzoM.js";
13
13
  import "./chunk-CAZujdOi.js";
@@ -16,14 +16,14 @@ import "./ssrf-q6hBiAOi.js";
16
16
  import "./boolean-BW6OTjPi.js";
17
17
  import "./shell-env-DgjeObDZ.js";
18
18
  import "./manifest-registry-CAWGTwb5.js";
19
- import "./chrome-B7-rO4i9.js";
19
+ import "./chrome-BKUACyeO.js";
20
20
  import "./skills-DO7WNsVJ.js";
21
21
  import "./redact-DSOAcWMe.js";
22
22
  import "./errors-BEU7IHU6.js";
23
23
  import "./tokens-yWO1wD7Z.js";
24
24
  import "./thinking-DgjGxdSP.js";
25
25
  import { n as resolveSessionFilePath, s as resolveStorePath } from "./paths-BsT3BvfH.js";
26
- import "./manager-CFenq_aO.js";
26
+ import "./manager-rvtFoeFT.js";
27
27
  import "./github-copilot-token-dYUr1mDQ.js";
28
28
  import "./sqlite-D8iYC_CU.js";
29
29
  import "./markdown-tables-jQzXAsf3.js";
@@ -3,15 +3,15 @@ import "./registry-C-JddWwo.js";
3
3
  import { o as resolveAgentWorkspaceDir, s as resolveDefaultAgentId } from "./agent-scope-B1Ina6jV.js";
4
4
  import "./subsystem-DzRUKS9f.js";
5
5
  import "./workspace-CsaDUuDn.js";
6
- import { t as runAgentTurn } from "./unified-runner-BVvvnjXW.js";
6
+ import { t as runAgentTurn } from "./unified-runner-BIiKFnNF.js";
7
7
  import "./auth-profiles-BSw0aQND.js";
8
8
  import "./model-selection-BqshlIZc.js";
9
- import "./deliver-DTRkeYm3.js";
9
+ import "./deliver-DyO3QD8O.js";
10
10
  import "./ssrf-oI58TMOb.js";
11
11
  import "./boolean-BsqeuxE6.js";
12
12
  import "./shell-env-B1lDWz4t.js";
13
13
  import "./manifest-registry-BGJu2aC-.js";
14
- import "./chrome-DPjznJQ-.js";
14
+ import "./chrome-C_I81hbq.js";
15
15
  import "./frontmatter-CJEX1BrH.js";
16
16
  import "./skills-Dm4gX4Tl.js";
17
17
  import "./redact-CSGZUFxa.js";
@@ -25,7 +25,7 @@ import "./paths-BsT3BvfH.js";
25
25
  import "./tokens-D_vCJSzF.js";
26
26
  import "./diagnostic-BALvP9wI.js";
27
27
  import "./diagnostic-session-state-BDfanaOY.js";
28
- import "./manager-CsxTf96V.js";
28
+ import "./manager-PTSjHNVq.js";
29
29
  import "./github-copilot-token-uhEBNQfj.js";
30
30
  import "./pi-auth-json-DCGR3yfh.js";
31
31
  import "./reply-prefix-D0NzzC4I.js";
@@ -4449,7 +4449,7 @@ var MemoryIndexManager = class MemoryIndexManager extends MemoryManagerEmbedding
4449
4449
  * to bypass the min-interval guard (CLI use).
4450
4450
  */
4451
4451
  async runL3CycleIfDue(params) {
4452
- const [{ runL3Cycle, runL3CycleIfDue }, { createSynthesizer }] = await Promise.all([import("./consolidate-Dyh_aESo.js"), import("./synthesis-CBIT6Vnk.js")]);
4452
+ const [{ runL3Cycle, runL3CycleIfDue }, { createSynthesizer }] = await Promise.all([import("./consolidate-Dyh_aESo.js"), import("./synthesis-fD8J2vag.js")]);
4453
4453
  const synthesize = createSynthesizer({
4454
4454
  cfg: this.cfg,
4455
4455
  agentId: this.agentId,
@@ -4449,7 +4449,7 @@ var MemoryIndexManager = class MemoryIndexManager extends MemoryManagerEmbedding
4449
4449
  * to bypass the min-interval guard (CLI use).
4450
4450
  */
4451
4451
  async runL3CycleIfDue(params) {
4452
- const [{ runL3Cycle, runL3CycleIfDue }, { createSynthesizer }] = await Promise.all([import("./consolidate-CwJCvaOH.js"), import("./synthesis-Be9nYyDd.js")]);
4452
+ const [{ runL3Cycle, runL3CycleIfDue }, { createSynthesizer }] = await Promise.all([import("./consolidate-CwJCvaOH.js"), import("./synthesis-7UL3pCpj.js")]);
4453
4453
  const synthesize = createSynthesizer({
4454
4454
  cfg: this.cfg,
4455
4455
  agentId: this.agentId,
@@ -9,7 +9,7 @@ import { i as resolveAckReaction, o as resolveEffectiveMessagesConfig, r as reso
9
9
  import { t as normalizeChatType } from "./chat-type-Acj2OK2p.js";
10
10
  import { i as resolveSlackAccount, n as listChannelPlugins, o as resolveSlackAppToken, r as normalizeChannelId$1, s as resolveSlackBotToken, t as getChannelPlugin } from "./plugins-CZ_mYwXq.js";
11
11
  import { S as resolveSlackChannelId, _ as resolveSlackWebClientOptions, a as sendMessageSlack, b as buildSlackBlocksFallbackText, c as getDefaultLocalRoots, d as fetchRemoteMedia, f as readResponseWithLimit, g as createSlackWebClient, h as fetchWithTimeout, i as resolveSlackThreadTs, l as loadWebMedia, m as bindAbortRelay, n as deliverReplies, o as renderMarkdownWithMarkers, p as fetchWithSsrFGuard, s as markdownToIRWithMeta, t as createSlackReplyDeliveryPlan, u as MediaFetchError, v as parseSlackBlocksInput, x as parseSlackTarget, y as validateSlackBlocksArray } from "./replies-BYF1gbJf.js";
12
- import { $ as loadSessionStore, $t as resolveToolProfilePolicy, A as formatRawAssistantErrorForUi, At as resolveMainSessionKey, B as isRateLimitAssistantError, Bt as saveMediaBuffer, C as downgradeOpenAIReasoningBlocks, Ct as resolveChannelResetConfig, D as classifyFailoverReason, Dt as DEFAULT_RESET_TRIGGERS, E as BILLING_ERROR_USER_MESSAGE, Et as resolveThreadFlag, F as isCompactionFailureError, Ft as createBrowserRouteContext, G as parseImageSizeError, Gt as resolveBrowserControlAuth, H as isTimeoutErrorMessage, Ht as resolveExistingPathsWithinRoot, I as isContextOverflowError, It as registerBrowserRoutes, J as resolveSandboxContext, Jt as collectExplicitAllowlist, K as sanitizeUserFacingText, Kt as applyOwnerOnlyToolPolicy, L as isFailoverAssistantError, Lt as resolveBrowserConfig, M as isAuthAssistantError, Mt as resolveGroupSessionKey, N as isBillingAssistantError, Nt as acquireSessionWriteLock, O as formatAssistantErrorText, Ot as resolveFreshSessionTotalTokens, P as isCloudCodeAssistFormatError, Pt as resolveSessionLockMaxHoldFromTimeout, Q as resolveAndPersistSessionFile, Qt as normalizeToolName$1, R as isFailoverErrorMessage, Rt as resolveProfile, S as extractToolResultId, St as evaluateSessionFreshness, T as isGoogleModelApi, Tt as resolveSessionResetType, U as isTransientHttpError, Ut as getBridgeAuthForPort, V as isRawApiErrorPayload, Vt as DEFAULT_UPLOAD_DIR, W as parseImageDimensionError, Wt as ensureBrowserControlAuth, X as extractDeliveryInfo, Xt as expandToolGroups, Y as resolveSandboxRuntimeStatus, Yt as expandPolicyWithPluginGroups, Z as appendAssistantMessageToSessionTranscript, Zt as mergeAlsoAllowPolicy, _ as sanitizeSessionMessagesImages, _t as INPUT_PROVENANCE_KIND_VALUES, a as normalizeChannelTargetInput, an as resolveBootstrapMaxChars, at as updateSessionStoreEntry, b as resolveImageSanitizationLimits, bt as normalizeInputProvenance, c as parseReplyDirectives, cn as getGlobalHookRunner, ct as deliveryContextFromSession, d as parseInlineDirectives$1, dt as normalizeDeliveryContext, en as stripPluginOnlyAllowlist, et as readSessionUpdatedAt, f as validateAnthropicTurns, ft as normalizeSessionDeliveryFields, g as normalizeTextForComparison, gt as extractToolCallNames, h as isMessagingToolDuplicateNormalized, ht as countToolResults, i as buildTargetResolverSignature, in as ensureSessionHeader, it as updateSessionStore, j as getApiErrorPayloadFingerprint, jt as deriveSessionMetaPatch, k as formatBillingErrorMessage, kt as canonicalizeMainSessionAlias, l as MEDIA_TOKEN_RE, ln as initializeGlobalHookRunner, lt as deliveryContextKey, m as pickFallbackThinkingLevel, mt as capArrayByJsonBytes, nn as matchesAnyGlobPattern, o as normalizeTargetForProvider, on as resolveBootstrapTotalMaxChars, ot as isCacheEnabled, p as validateGeminiTurns, pt as archiveSessionTranscripts, q as ensureSandboxWorkspaceForSession, qt as buildPluginToolGroups, r as normalizeReplyPayloadsForDelivery, rn as buildBootstrapContextFiles, rt as updateLastRoute, s as throwIfAborted, sn as sanitizeGoogleTurnOrdering, st as resolveCacheTtlMs$1, t as deliverOutboundPayloads, tn as compileGlobPatterns, tt as recordSessionMetaFromInbound, u as splitMediaFromOutput, ut as mergeDeliveryContext, v as sanitizeImageBlocks, vt as applyInputProvenanceToUserMessage, w as isAntigravityClaude, wt as resolveSessionResetPolicy, x as extractToolCallsFromAssistant, xt as resolveSessionKey, y as sanitizeToolResultImages, yt as hasInterSessionUserProvenance, z as isLikelyContextOverflowError, zt as getMediaDir } from "./deliver-oWGJwzFf.js";
12
+ import { $ as loadSessionStore, $t as resolveToolProfilePolicy, A as formatRawAssistantErrorForUi, At as resolveMainSessionKey, B as isRateLimitAssistantError, Bt as saveMediaBuffer, C as downgradeOpenAIReasoningBlocks, Ct as resolveChannelResetConfig, D as classifyFailoverReason, Dt as DEFAULT_RESET_TRIGGERS, E as BILLING_ERROR_USER_MESSAGE, Et as resolveThreadFlag, F as isCompactionFailureError, Ft as createBrowserRouteContext, G as parseImageSizeError, Gt as resolveBrowserControlAuth, H as isTimeoutErrorMessage, Ht as resolveExistingPathsWithinRoot, I as isContextOverflowError, It as registerBrowserRoutes, J as resolveSandboxContext, Jt as collectExplicitAllowlist, K as sanitizeUserFacingText, Kt as applyOwnerOnlyToolPolicy, L as isFailoverAssistantError, Lt as resolveBrowserConfig, M as isAuthAssistantError, Mt as resolveGroupSessionKey, N as isBillingAssistantError, Nt as acquireSessionWriteLock, O as formatAssistantErrorText, Ot as resolveFreshSessionTotalTokens, P as isCloudCodeAssistFormatError, Pt as resolveSessionLockMaxHoldFromTimeout, Q as resolveAndPersistSessionFile, Qt as normalizeToolName$1, R as isFailoverErrorMessage, Rt as resolveProfile, S as extractToolResultId, St as evaluateSessionFreshness, T as isGoogleModelApi, Tt as resolveSessionResetType, U as isTransientHttpError, Ut as getBridgeAuthForPort, V as isRawApiErrorPayload, Vt as DEFAULT_UPLOAD_DIR, W as parseImageDimensionError, Wt as ensureBrowserControlAuth, X as extractDeliveryInfo, Xt as expandToolGroups, Y as resolveSandboxRuntimeStatus, Yt as expandPolicyWithPluginGroups, Z as appendAssistantMessageToSessionTranscript, Zt as mergeAlsoAllowPolicy, _ as sanitizeSessionMessagesImages, _t as INPUT_PROVENANCE_KIND_VALUES, a as normalizeChannelTargetInput, an as resolveBootstrapMaxChars, at as updateSessionStoreEntry, b as resolveImageSanitizationLimits, bt as normalizeInputProvenance, c as parseReplyDirectives, cn as getGlobalHookRunner, ct as deliveryContextFromSession, d as parseInlineDirectives$1, dt as normalizeDeliveryContext, en as stripPluginOnlyAllowlist, et as readSessionUpdatedAt, f as validateAnthropicTurns, ft as normalizeSessionDeliveryFields, g as normalizeTextForComparison, gt as extractToolCallNames, h as isMessagingToolDuplicateNormalized, ht as countToolResults, i as buildTargetResolverSignature, in as ensureSessionHeader, it as updateSessionStore, j as getApiErrorPayloadFingerprint, jt as deriveSessionMetaPatch, k as formatBillingErrorMessage, kt as canonicalizeMainSessionAlias, l as MEDIA_TOKEN_RE, ln as initializeGlobalHookRunner, lt as deliveryContextKey, m as pickFallbackThinkingLevel, mt as capArrayByJsonBytes, nn as matchesAnyGlobPattern, o as normalizeTargetForProvider, on as resolveBootstrapTotalMaxChars, ot as isCacheEnabled, p as validateGeminiTurns, pt as archiveSessionTranscripts, q as ensureSandboxWorkspaceForSession, qt as buildPluginToolGroups, r as normalizeReplyPayloadsForDelivery, rn as buildBootstrapContextFiles, rt as updateLastRoute, s as throwIfAborted, sn as sanitizeGoogleTurnOrdering, st as resolveCacheTtlMs$1, t as deliverOutboundPayloads, tn as compileGlobPatterns, tt as recordSessionMetaFromInbound, u as splitMediaFromOutput, ut as mergeDeliveryContext, v as sanitizeImageBlocks, vt as applyInputProvenanceToUserMessage, w as isAntigravityClaude, wt as resolveSessionResetPolicy, x as extractToolCallsFromAssistant, xt as resolveSessionKey, y as sanitizeToolResultImages, yt as hasInterSessionUserProvenance, z as isLikelyContextOverflowError, zt as getMediaDir } from "./deliver-Cjyb6h4g.js";
13
13
  import { a as logMessageProcessed, i as logLaneEnqueue, o as logMessageQueued, r as logLaneDequeue, s as logSessionStateChange, t as diag } from "./diagnostic-BdRnGknC.js";
14
14
  import { n as getDiagnosticSessionState } from "./diagnostic-session-state-DpxCUzoM.js";
15
15
  import { S as GATEWAY_CLIENT_NAMES, _ as listDeliverableMessageChannels, a as chunkText, b as GATEWAY_CLIENT_IDS, c as resolveChunkMode, d as isSafeFenceBreak, f as parseFenceSpans, g as isMarkdownCapableMessageChannel, h as isInternalMessageChannel, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, m as isDeliverableMessageChannel, o as chunkTextWithMode, p as INTERNAL_MESSAGE_CHANNEL, r as chunkMarkdownText, t as chunkByNewline, u as findFenceSpanAt, v as normalizeMessageChannel, x as GATEWAY_CLIENT_MODES, y as resolveGatewayMessageChannel } from "./chunk-CAZujdOi.js";
@@ -18,7 +18,7 @@ import { C as unsetConfigValueAtPath, S as setConfigValueAtPath, T as VERSION, _
18
18
  import { t as parseBooleanValue } from "./boolean-BW6OTjPi.js";
19
19
  import { i as resolveShellEnvFallbackTimeoutMs, n as getShellPathFromLoginShell, s as isTruthyEnvValue } from "./shell-env-DgjeObDZ.js";
20
20
  import { c as normalizePluginsConfig, f as isPathInsideWithRealpath, i as safeStatSync, l as resolveEnableState, n as discoverSymiPlugins, p as isDangerousHostEnvVarName, r as isPathInside, s as applyTestPluginDefaults, t as loadPluginManifestRegistry, u as resolveMemorySlotDecision } from "./manifest-registry-CAWGTwb5.js";
21
- import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-B7-rO4i9.js";
21
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-BKUACyeO.js";
22
22
  import { n as resolveCliName, t as formatCliCommand } from "./command-format-DPd9RN2g.js";
23
23
  import { c as assertSandboxPath, d as resolveSandboxedMediaSource, f as applySkillEnvOverrides, h as parseFrontmatterBlock, i as resolveSkillsPromptForRun, l as resolveSandboxInputPath, n as buildWorkspaceSkillSnapshot, p as applySkillEnvOverridesFromSnapshot, r as loadWorkspaceSkillEntries, s as assertMediaNotDataUrl } from "./skills-DO7WNsVJ.js";
24
24
  import { n as redactToolDetail } from "./redact-DSOAcWMe.js";
@@ -29,7 +29,7 @@ import { n as resolveConversationLabel } from "./conversation-label-DTTqF8gH.js"
29
29
  import { i as resolveSessionTranscriptPath, n as resolveSessionFilePath, o as resolveSessionTranscriptsDirForAgent, r as resolveSessionFilePathOptions, s as resolveStorePath, t as resolveDefaultSessionStorePath } from "./paths-BsT3BvfH.js";
30
30
  import { t as emitSessionTranscriptUpdate } from "./transcript-events-ChU6IQwp.js";
31
31
  import { n as saveJsonFile, t as loadJsonFile } from "./json-file-B7D44OOV.js";
32
- import { a as parseGeminiAuth, c as resolveMemorySearchConfig, d as requireApiKey, f as resolveApiKeyForProvider, h as resolveModelAuthMode, i as resolveOllamaBaseUrl, l as getApiKeyForModel, m as resolveEnvApiKey, n as retryAsync, o as collectProviderApiKeysForExecution, p as resolveAwsSdkEnvVarName, r as probeOllamaEmbeddingModels, s as executeWithApiKeyRotation, u as getCustomProviderApiKey } from "./manager-CFenq_aO.js";
32
+ import { a as parseGeminiAuth, c as resolveMemorySearchConfig, d as requireApiKey, f as resolveApiKeyForProvider, h as resolveModelAuthMode, i as resolveOllamaBaseUrl, l as getApiKeyForModel, m as resolveEnvApiKey, n as retryAsync, o as collectProviderApiKeysForExecution, p as resolveAwsSdkEnvVarName, r as probeOllamaEmbeddingModels, s as executeWithApiKeyRotation, u as getCustomProviderApiKey } from "./manager-rvtFoeFT.js";
33
33
  import { r as resolveCopilotApiToken, t as DEFAULT_COPILOT_API_BASE_URL } from "./github-copilot-token-dYUr1mDQ.js";
34
34
  import { c as normalizeExtraMemoryPaths, f as runTasksWithConcurrency, s as listMemoryFiles } from "./internal-Ce-sg7EN.js";
35
35
  import { n as resolveMarkdownTableMode } from "./markdown-tables-jQzXAsf3.js";
@@ -53,7 +53,7 @@ import { fileURLToPath } from "node:url";
53
53
  import { CURRENT_SESSION_VERSION, DefaultResourceLoader, SessionManager, SettingsManager, codingTools, createAgentSession, createEditTool, createReadTool, createWriteTool, estimateTokens, generateSummary, readTool } from "@mariozechner/pi-coding-agent";
54
54
  import crypto, { X509Certificate, createHash, createHmac, randomBytes, randomUUID } from "node:crypto";
55
55
  import AjvPkg from "ajv";
56
- import { WebSocket as WebSocket$1 } from "ws";
56
+ import { WebSocket } from "ws";
57
57
  import { Buffer as Buffer$1 } from "node:buffer";
58
58
  import { complete, createAssistantMessageEventStream, streamSimple } from "@mariozechner/pi-ai";
59
59
  import { BedrockClient, ListFoundationModelsCommand } from "@aws-sdk/client-bedrock";
@@ -3390,7 +3390,7 @@ async function getMemorySearchManager(params) {
3390
3390
  const wrapper = new FallbackMemoryManager({
3391
3391
  primary,
3392
3392
  fallbackFactory: async () => {
3393
- const { MemoryIndexManager } = await import("./manager-CFenq_aO.js").then((n) => n.t);
3393
+ const { MemoryIndexManager } = await import("./manager-rvtFoeFT.js").then((n) => n.t);
3394
3394
  return await MemoryIndexManager.get(params);
3395
3395
  }
3396
3396
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -3403,7 +3403,7 @@ async function getMemorySearchManager(params) {
3403
3403
  }
3404
3404
  }
3405
3405
  try {
3406
- const { MemoryIndexManager } = await import("./manager-CFenq_aO.js").then((n) => n.t);
3406
+ const { MemoryIndexManager } = await import("./manager-rvtFoeFT.js").then((n) => n.t);
3407
3407
  return { manager: await MemoryIndexManager.get(params) };
3408
3408
  } catch (err) {
3409
3409
  return {
@@ -5920,7 +5920,7 @@ var GatewayClient = class {
5920
5920
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
5921
5921
  });
5922
5922
  }
5923
- this.ws = new WebSocket$1(url, wsOptions);
5923
+ this.ws = new WebSocket(url, wsOptions);
5924
5924
  this.ws.on("open", () => {
5925
5925
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
5926
5926
  const tlsError = this.validateTlsFingerprint();
@@ -6139,7 +6139,7 @@ var GatewayClient = class {
6139
6139
  return null;
6140
6140
  }
6141
6141
  async request(method, params, opts) {
6142
- if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
6142
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
6143
6143
  const id = randomUUID();
6144
6144
  const frame = {
6145
6145
  type: "req",
@@ -7087,7 +7087,7 @@ async function routeReply(params) {
7087
7087
  const resolvedReplyToId = replyToId ?? (channelId === "slack" && threadId != null && threadId !== "" ? String(threadId) : void 0);
7088
7088
  const resolvedThreadId = channelId === "slack" ? null : threadId ?? null;
7089
7089
  try {
7090
- const { deliverOutboundPayloads } = await import("./deliver-oWGJwzFf.js").then((n) => n.n);
7090
+ const { deliverOutboundPayloads } = await import("./deliver-Cjyb6h4g.js").then((n) => n.n);
7091
7091
  return {
7092
7092
  ok: true,
7093
7093
  messageId: (await deliverOutboundPayloads({
@@ -41151,7 +41151,7 @@ async function deliverSessionMaintenanceWarning(params) {
41151
41151
  return;
41152
41152
  }
41153
41153
  try {
41154
- const { deliverOutboundPayloads } = await import("./deliver-oWGJwzFf.js").then((n) => n.n);
41154
+ const { deliverOutboundPayloads } = await import("./deliver-Cjyb6h4g.js").then((n) => n.n);
41155
41155
  await deliverOutboundPayloads({
41156
41156
  cfg: params.cfg,
41157
41157
  channel,
@@ -7,7 +7,7 @@ import "./ssrf-q6hBiAOi.js";
7
7
  import "./boolean-BW6OTjPi.js";
8
8
  import "./shell-env-DgjeObDZ.js";
9
9
  import "./manifest-registry-CAWGTwb5.js";
10
- 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-B7-rO4i9.js";
10
+ 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-BKUACyeO.js";
11
11
  import { t as formatCliCommand } from "./command-format-DPd9RN2g.js";
12
12
  import "./redact-DSOAcWMe.js";
13
13
  import { n as formatErrorMessage } from "./errors-BEU7IHU6.js";
@@ -9,7 +9,7 @@ import "./ssrf-oI58TMOb.js";
9
9
  import "./boolean-BsqeuxE6.js";
10
10
  import "./shell-env-B1lDWz4t.js";
11
11
  import "./manifest-registry-BGJu2aC-.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-DPjznJQ-.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-C_I81hbq.js";
13
13
  import "./redact-CSGZUFxa.js";
14
14
  import { n as formatErrorMessage } from "./errors-C89ppfp9.js";
15
15
  import path from "node:path";
@@ -6,8 +6,8 @@ import "./model-selection-BisYvTBb.js";
6
6
  import "./reply-prefix-i-FPYcoQ.js";
7
7
  import "./plugins-CZ_mYwXq.js";
8
8
  import "./replies-BYF1gbJf.js";
9
- import { n as runAgentTurn } from "./pi-embedded-Cdub5Vs9.js";
10
- import "./deliver-oWGJwzFf.js";
9
+ import { n as runAgentTurn } from "./pi-embedded-BPuUM-gD.js";
10
+ import "./deliver-Cjyb6h4g.js";
11
11
  import "./diagnostic-BdRnGknC.js";
12
12
  import "./diagnostic-session-state-DpxCUzoM.js";
13
13
  import "./chunk-CAZujdOi.js";
@@ -16,14 +16,14 @@ import "./ssrf-q6hBiAOi.js";
16
16
  import "./boolean-BW6OTjPi.js";
17
17
  import "./shell-env-DgjeObDZ.js";
18
18
  import "./manifest-registry-CAWGTwb5.js";
19
- import "./chrome-B7-rO4i9.js";
19
+ import "./chrome-BKUACyeO.js";
20
20
  import "./skills-DO7WNsVJ.js";
21
21
  import "./redact-DSOAcWMe.js";
22
22
  import "./errors-BEU7IHU6.js";
23
23
  import "./tokens-yWO1wD7Z.js";
24
24
  import "./thinking-DgjGxdSP.js";
25
25
  import "./paths-BsT3BvfH.js";
26
- import "./manager-CFenq_aO.js";
26
+ import "./manager-rvtFoeFT.js";
27
27
  import "./github-copilot-token-dYUr1mDQ.js";
28
28
  import "./sqlite-D8iYC_CU.js";
29
29
  import "./markdown-tables-jQzXAsf3.js";
@@ -3,15 +3,15 @@ import "./registry-C-JddWwo.js";
3
3
  import "./agent-scope-B1Ina6jV.js";
4
4
  import { t as createSubsystemLogger } from "./subsystem-DzRUKS9f.js";
5
5
  import "./workspace-CsaDUuDn.js";
6
- import { t as runAgentTurn } from "./unified-runner-BVvvnjXW.js";
6
+ import { t as runAgentTurn } from "./unified-runner-BIiKFnNF.js";
7
7
  import "./auth-profiles-BSw0aQND.js";
8
8
  import "./model-selection-BqshlIZc.js";
9
- import "./deliver-DTRkeYm3.js";
9
+ import "./deliver-DyO3QD8O.js";
10
10
  import "./ssrf-oI58TMOb.js";
11
11
  import "./boolean-BsqeuxE6.js";
12
12
  import "./shell-env-B1lDWz4t.js";
13
13
  import "./manifest-registry-BGJu2aC-.js";
14
- import "./chrome-DPjznJQ-.js";
14
+ import "./chrome-C_I81hbq.js";
15
15
  import "./frontmatter-CJEX1BrH.js";
16
16
  import "./skills-Dm4gX4Tl.js";
17
17
  import "./redact-CSGZUFxa.js";
@@ -25,7 +25,7 @@ import "./paths-BsT3BvfH.js";
25
25
  import "./tokens-D_vCJSzF.js";
26
26
  import "./diagnostic-BALvP9wI.js";
27
27
  import "./diagnostic-session-state-BDfanaOY.js";
28
- import "./manager-CsxTf96V.js";
28
+ import "./manager-PTSjHNVq.js";
29
29
  import "./github-copilot-token-uhEBNQfj.js";
30
30
  import "./pi-auth-json-DCGR3yfh.js";
31
31
  import "./reply-prefix-D0NzzC4I.js";
@@ -9,12 +9,12 @@ import { _ as resolveAuthProfileDisplayLabel, a as markAuthProfileFailure, c as
9
9
  import { n as resolveCliName, t as formatCliCommand } from "./command-format-BrrHNE8r.js";
10
10
  import { _ as DEFAULT_MODEL, c as normalizeProviderId, d as resolveDefaultModelForAgent, f as resolveModelRefFromString, g as DEFAULT_CONTEXT_TOKENS, h as getProviderAdapter, i as findNormalizedProviderValue, m as resolveThinkingDefault, n as buildConfiguredAllowlistKeys, o as modelKey, p as resolveSubagentSpawnModelSelection, r as buildModelAliasIndex, s as normalizeModelRef$1, t as buildAllowedModelSet, u as resolveConfiguredModelRef, v as DEFAULT_PROVIDER } from "./model-selection-BqshlIZc.js";
11
11
  import { n as saveJsonFile, t as loadJsonFile } from "./json-file-CZ3ssFR9.js";
12
- import { $ as resolveSandboxContext, $t as resolveBrowserControlAuth, A as isGoogleModelApi, At as resolveSessionResetPolicy, B as isCompactionFailureError, Bt as resolveGroupSessionKey, C as sanitizeImageBlocks, Ct as INPUT_PROVENANCE_KIND_VALUES, D as extractToolResultId, Dt as resolveSessionKey, E as extractToolCallsFromAssistant, Et as normalizeInputProvenance, F as formatRawAssistantErrorForUi, Ft as canonicalizeMainSessionAlias, G as isRateLimitAssistantError, Gt as resolveBrowserConfig, H as isFailoverAssistantError, Ht as resolveSessionLockMaxHoldFromTimeout, I as getApiErrorPayloadFingerprint, J as isTransientHttpError, Jt as saveMediaBuffer, K as isRawApiErrorPayload, Kt as resolveProfile, L as isAuthAssistantError, M as classifyFailoverReason, Mt as resolveThreadFlag, N as formatAssistantErrorText, Nt as DEFAULT_RESET_TRIGGERS, O as downgradeOpenAIReasoningBlocks, Ot as evaluateSessionFreshness, P as formatBillingErrorMessage, Pt as resolveFreshSessionTotalTokens, Q as ensureSandboxWorkspaceForSession, Qt as ensureBrowserControlAuth, R as isBillingAssistantError, Rt as resolveMainSessionKey, S as sanitizeSessionMessagesImages, St as extractToolCallNames, T as resolveImageSanitizationLimits, Tt as hasInterSessionUserProvenance, U as isFailoverErrorMessage, Ut as createBrowserRouteContext, V as isContextOverflowError, Vt as acquireSessionWriteLock, W as isLikelyContextOverflowError, Wt as registerBrowserRoutes, X as parseImageSizeError, Xt as resolveExistingPathsWithinRoot, Y as parseImageDimensionError, Yt as DEFAULT_UPLOAD_DIR, Z as sanitizeUserFacingText, Zt as getBridgeAuthForPort, _ as validateAnthropicTurns, _t as normalizeSessionDeliveryFields, an as mergeAlsoAllowPolicy, at as loadSessionStore, b as isMessagingToolDuplicateNormalized, bt as capArrayByJsonBytes, c as normalizeChannelTargetInput, cn as stripPluginOnlyAllowlist, ct as updateLastRoute, d as parseReplyDirectives, dn as buildBootstrapContextFiles, dt as isCacheEnabled, en as applyOwnerOnlyToolPolicy, et as resolveSandboxRuntimeStatus, f as MEDIA_TOKEN_RE, fn as ensureSessionHeader, ft as resolveCacheTtlMs$1, g as initializeGlobalHookRunner, gt as normalizeDeliveryContext, h as getGlobalHookRunner, hn as sanitizeGoogleTurnOrdering, ht as mergeDeliveryContext, in as expandToolGroups, it as resolveAndPersistSessionFile, j as BILLING_ERROR_USER_MESSAGE, jt as resolveSessionResetType, k as isAntigravityClaude, kt as resolveChannelResetConfig, l as normalizeTargetForProvider, ln as compileGlobPatterns, lt as updateSessionStore, m as parseInlineDirectives$1, mn as resolveBootstrapTotalMaxChars, mt as deliveryContextKey, nn as collectExplicitAllowlist, o as normalizeReplyPayloadsForDelivery, on as normalizeToolName$1, ot as readSessionUpdatedAt, p as splitMediaFromOutput, pn as resolveBootstrapMaxChars, pt as deliveryContextFromSession, q as isTimeoutErrorMessage, qt as getMediaDir, rn as expandPolicyWithPluginGroups, rt as appendAssistantMessageToSessionTranscript, s as buildTargetResolverSignature, sn as resolveToolProfilePolicy, st as recordSessionMetaFromInbound, t as deliverOutboundPayloads, tn as buildPluginToolGroups, tt as extractDeliveryInfo, u as throwIfAborted, un as matchesAnyGlobPattern, ut as updateSessionStoreEntry, v as validateGeminiTurns, w as sanitizeToolResultImages, wt as applyInputProvenanceToUserMessage, x as normalizeTextForComparison, xt as countToolResults, y as pickFallbackThinkingLevel, yt as archiveSessionTranscripts, z as isCloudCodeAssistFormatError, zt as deriveSessionMetaPatch } from "./deliver-DTRkeYm3.js";
12
+ import { $ as resolveSandboxContext, $t as resolveBrowserControlAuth, A as isGoogleModelApi, At as resolveSessionResetPolicy, B as isCompactionFailureError, Bt as resolveGroupSessionKey, C as sanitizeImageBlocks, Ct as INPUT_PROVENANCE_KIND_VALUES, D as extractToolResultId, Dt as resolveSessionKey, E as extractToolCallsFromAssistant, Et as normalizeInputProvenance, F as formatRawAssistantErrorForUi, Ft as canonicalizeMainSessionAlias, G as isRateLimitAssistantError, Gt as resolveBrowserConfig, H as isFailoverAssistantError, Ht as resolveSessionLockMaxHoldFromTimeout, I as getApiErrorPayloadFingerprint, J as isTransientHttpError, Jt as saveMediaBuffer, K as isRawApiErrorPayload, Kt as resolveProfile, L as isAuthAssistantError, M as classifyFailoverReason, Mt as resolveThreadFlag, N as formatAssistantErrorText, Nt as DEFAULT_RESET_TRIGGERS, O as downgradeOpenAIReasoningBlocks, Ot as evaluateSessionFreshness, P as formatBillingErrorMessage, Pt as resolveFreshSessionTotalTokens, Q as ensureSandboxWorkspaceForSession, Qt as ensureBrowserControlAuth, R as isBillingAssistantError, Rt as resolveMainSessionKey, S as sanitizeSessionMessagesImages, St as extractToolCallNames, T as resolveImageSanitizationLimits, Tt as hasInterSessionUserProvenance, U as isFailoverErrorMessage, Ut as createBrowserRouteContext, V as isContextOverflowError, Vt as acquireSessionWriteLock, W as isLikelyContextOverflowError, Wt as registerBrowserRoutes, X as parseImageSizeError, Xt as resolveExistingPathsWithinRoot, Y as parseImageDimensionError, Yt as DEFAULT_UPLOAD_DIR, Z as sanitizeUserFacingText, Zt as getBridgeAuthForPort, _ as validateAnthropicTurns, _t as normalizeSessionDeliveryFields, an as mergeAlsoAllowPolicy, at as loadSessionStore, b as isMessagingToolDuplicateNormalized, bt as capArrayByJsonBytes, c as normalizeChannelTargetInput, cn as stripPluginOnlyAllowlist, ct as updateLastRoute, d as parseReplyDirectives, dn as buildBootstrapContextFiles, dt as isCacheEnabled, en as applyOwnerOnlyToolPolicy, et as resolveSandboxRuntimeStatus, f as MEDIA_TOKEN_RE, fn as ensureSessionHeader, ft as resolveCacheTtlMs$1, g as initializeGlobalHookRunner, gt as normalizeDeliveryContext, h as getGlobalHookRunner, hn as sanitizeGoogleTurnOrdering, ht as mergeDeliveryContext, in as expandToolGroups, it as resolveAndPersistSessionFile, j as BILLING_ERROR_USER_MESSAGE, jt as resolveSessionResetType, k as isAntigravityClaude, kt as resolveChannelResetConfig, l as normalizeTargetForProvider, ln as compileGlobPatterns, lt as updateSessionStore, m as parseInlineDirectives$1, mn as resolveBootstrapTotalMaxChars, mt as deliveryContextKey, nn as collectExplicitAllowlist, o as normalizeReplyPayloadsForDelivery, on as normalizeToolName$1, ot as readSessionUpdatedAt, p as splitMediaFromOutput, pn as resolveBootstrapMaxChars, pt as deliveryContextFromSession, q as isTimeoutErrorMessage, qt as getMediaDir, rn as expandPolicyWithPluginGroups, rt as appendAssistantMessageToSessionTranscript, s as buildTargetResolverSignature, sn as resolveToolProfilePolicy, st as recordSessionMetaFromInbound, t as deliverOutboundPayloads, tn as buildPluginToolGroups, tt as extractDeliveryInfo, u as throwIfAborted, un as matchesAnyGlobPattern, ut as updateSessionStoreEntry, v as validateGeminiTurns, w as sanitizeToolResultImages, wt as applyInputProvenanceToUserMessage, x as normalizeTextForComparison, xt as countToolResults, y as pickFallbackThinkingLevel, yt as archiveSessionTranscripts, z as isCloudCodeAssistFormatError, zt as deriveSessionMetaPatch } from "./deliver-DyO3QD8O.js";
13
13
  import { C as unsetConfigValueAtPath, S as setConfigValueAtPath, T as VERSION, _ as resetConfigOverrides, b as getConfigValueAtPath, c as loadConfig, d as writeConfigFile, f as validateConfigObjectWithPlugins, g as getConfigOverrides, h as validateJsonSchemaValue, i as isBlockedHostnameOrIp, l as readConfigFileSnapshot, o as normalizeHostname, p as parseDurationMs, t as SsrFBlockedError, u as resolveConfigSnapshotHash, v as setConfigOverride, w as DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH, x as parseConfigPath, y as unsetConfigOverride } from "./ssrf-oI58TMOb.js";
14
14
  import { t as parseBooleanValue } from "./boolean-BsqeuxE6.js";
15
15
  import { i as resolveShellEnvFallbackTimeoutMs, n as getShellPathFromLoginShell, s as isTruthyEnvValue } from "./shell-env-B1lDWz4t.js";
16
16
  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-BGJu2aC-.js";
17
- import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-DPjznJQ-.js";
17
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-C_I81hbq.js";
18
18
  import { l as parseFrontmatterBlock } from "./frontmatter-CJEX1BrH.js";
19
19
  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-Dm4gX4Tl.js";
20
20
  import { n as redactToolDetail } from "./redact-CSGZUFxa.js";
@@ -31,7 +31,7 @@ import { t as emitSessionTranscriptUpdate } from "./transcript-events-ChU6IQwp.j
31
31
  import { n as isSilentReplyText, t as SILENT_REPLY_TOKEN } from "./tokens-D_vCJSzF.js";
32
32
  import { a as logMessageProcessed, i as logLaneEnqueue, o as logMessageQueued, r as logLaneDequeue, s as logSessionStateChange, t as diag } from "./diagnostic-BALvP9wI.js";
33
33
  import { n as getDiagnosticSessionState } from "./diagnostic-session-state-BDfanaOY.js";
34
- import { a as parseGeminiAuth, c as resolveMemorySearchConfig, d as requireApiKey, f as resolveApiKeyForProvider, h as resolveModelAuthMode, i as resolveOllamaBaseUrl, l as getApiKeyForModel, m as resolveEnvApiKey, n as retryAsync, o as collectProviderApiKeysForExecution, p as resolveAwsSdkEnvVarName, r as probeOllamaEmbeddingModels, s as executeWithApiKeyRotation, u as getCustomProviderApiKey } from "./manager-CsxTf96V.js";
34
+ import { a as parseGeminiAuth, c as resolveMemorySearchConfig, d as requireApiKey, f as resolveApiKeyForProvider, h as resolveModelAuthMode, i as resolveOllamaBaseUrl, l as getApiKeyForModel, m as resolveEnvApiKey, n as retryAsync, o as collectProviderApiKeysForExecution, p as resolveAwsSdkEnvVarName, r as probeOllamaEmbeddingModels, s as executeWithApiKeyRotation, u as getCustomProviderApiKey } from "./manager-PTSjHNVq.js";
35
35
  import { r as resolveCopilotApiToken, t as DEFAULT_COPILOT_API_BASE_URL } from "./github-copilot-token-uhEBNQfj.js";
36
36
  import { t as ensurePiAuthJsonFromAuthProfiles } from "./pi-auth-json-DCGR3yfh.js";
37
37
  import { a as resolveEffectiveMessagesConfig, i as resolveAckReaction, o as resolveHumanDelayConfig, r as resolveResponsePrefixTemplate, t as createReplyPrefixOptions } from "./reply-prefix-D0NzzC4I.js";
@@ -58,7 +58,7 @@ import crypto, { X509Certificate, createHash, createHmac, randomBytes, randomUUI
58
58
  import { complete, createAssistantMessageEventStream, streamSimple } from "@mariozechner/pi-ai";
59
59
  import AjvPkg from "ajv";
60
60
  import { CURRENT_SESSION_VERSION, DefaultResourceLoader, SessionManager, SettingsManager, codingTools, createAgentSession, createEditTool, createReadTool, createWriteTool, estimateTokens, generateSummary, readTool } from "@mariozechner/pi-coding-agent";
61
- import { WebSocket } from "ws";
61
+ import { WebSocket as WebSocket$1 } from "ws";
62
62
  import { Buffer as Buffer$1 } from "node:buffer";
63
63
  import { BedrockClient, ListFoundationModelsCommand } from "@aws-sdk/client-bedrock";
64
64
  import { createJiti } from "jiti";
@@ -4460,7 +4460,7 @@ async function getMemorySearchManager(params) {
4460
4460
  const wrapper = new FallbackMemoryManager({
4461
4461
  primary,
4462
4462
  fallbackFactory: async () => {
4463
- const { MemoryIndexManager } = await import("./manager-CsxTf96V.js").then((n) => n.t);
4463
+ const { MemoryIndexManager } = await import("./manager-PTSjHNVq.js").then((n) => n.t);
4464
4464
  return await MemoryIndexManager.get(params);
4465
4465
  }
4466
4466
  }, () => QMD_MANAGER_CACHE.delete(cacheKey));
@@ -4473,7 +4473,7 @@ async function getMemorySearchManager(params) {
4473
4473
  }
4474
4474
  }
4475
4475
  try {
4476
- const { MemoryIndexManager } = await import("./manager-CsxTf96V.js").then((n) => n.t);
4476
+ const { MemoryIndexManager } = await import("./manager-PTSjHNVq.js").then((n) => n.t);
4477
4477
  return { manager: await MemoryIndexManager.get(params) };
4478
4478
  } catch (err) {
4479
4479
  return {
@@ -9621,7 +9621,7 @@ var GatewayClient = class {
9621
9621
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
9622
9622
  });
9623
9623
  }
9624
- this.ws = new WebSocket(url, wsOptions);
9624
+ this.ws = new WebSocket$1(url, wsOptions);
9625
9625
  this.ws.on("open", () => {
9626
9626
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
9627
9627
  const tlsError = this.validateTlsFingerprint();
@@ -9840,7 +9840,7 @@ var GatewayClient = class {
9840
9840
  return null;
9841
9841
  }
9842
9842
  async request(method, params, opts) {
9843
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
9843
+ if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
9844
9844
  const id = randomUUID();
9845
9845
  const frame = {
9846
9846
  type: "req",
@@ -10801,7 +10801,7 @@ async function routeReply(params) {
10801
10801
  const resolvedReplyToId = replyToId ?? (channelId === "slack" && threadId != null && threadId !== "" ? String(threadId) : void 0);
10802
10802
  const resolvedThreadId = channelId === "slack" ? null : threadId ?? null;
10803
10803
  try {
10804
- const { deliverOutboundPayloads } = await import("./deliver-DTRkeYm3.js").then((n) => n.n);
10804
+ const { deliverOutboundPayloads } = await import("./deliver-DyO3QD8O.js").then((n) => n.n);
10805
10805
  return {
10806
10806
  ok: true,
10807
10807
  messageId: (await deliverOutboundPayloads({
@@ -43644,7 +43644,7 @@ async function deliverSessionMaintenanceWarning(params) {
43644
43644
  return;
43645
43645
  }
43646
43646
  try {
43647
- const { deliverOutboundPayloads } = await import("./deliver-DTRkeYm3.js").then((n) => n.n);
43647
+ const { deliverOutboundPayloads } = await import("./deliver-DyO3QD8O.js").then((n) => n.n);
43648
43648
  await deliverOutboundPayloads({
43649
43649
  cfg: params.cfg,
43650
43650
  channel,
@@ -0,0 +1,76 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { sendMessage } from "./graph-mail.js";
3
+ import * as store from "./store.js";
4
+
5
+ describe("graphFetch — empty-body success responses", () => {
6
+ let originalFetch: typeof fetch;
7
+
8
+ beforeEach(() => {
9
+ originalFetch = globalThis.fetch;
10
+ vi.spyOn(store, "getAccessToken").mockResolvedValue("test-bearer-token");
11
+ });
12
+
13
+ afterEach(() => {
14
+ globalThis.fetch = originalFetch;
15
+ vi.restoreAllMocks();
16
+ });
17
+
18
+ it("resolves on HTTP 202 with empty body (the /me/sendMail success shape)", async () => {
19
+ const fetchMock = vi.fn().mockResolvedValue(
20
+ new Response("", {
21
+ status: 202,
22
+ statusText: "Accepted",
23
+ }),
24
+ );
25
+ globalThis.fetch = fetchMock as unknown as typeof fetch;
26
+
27
+ await expect(
28
+ sendMessage({
29
+ to: ["test@example.com"],
30
+ subject: "test",
31
+ body: "test body",
32
+ }),
33
+ ).resolves.toBeUndefined();
34
+
35
+ expect(fetchMock).toHaveBeenCalledOnce();
36
+ const [url, init] = fetchMock.mock.calls[0]!;
37
+ expect(url).toBe("https://graph.microsoft.com/v1.0/me/sendMail");
38
+ expect(init?.method).toBe("POST");
39
+ });
40
+
41
+ it("resolves on HTTP 204 with empty body (existing behavior preserved)", async () => {
42
+ const fetchMock = vi.fn().mockResolvedValue(
43
+ new Response(null, {
44
+ status: 204,
45
+ statusText: "No Content",
46
+ }),
47
+ );
48
+ globalThis.fetch = fetchMock as unknown as typeof fetch;
49
+
50
+ await expect(
51
+ sendMessage({
52
+ to: ["test@example.com"],
53
+ subject: "test",
54
+ body: "test body",
55
+ }),
56
+ ).resolves.toBeUndefined();
57
+ });
58
+
59
+ it("propagates 4xx errors with body text in the thrown message", async () => {
60
+ const fetchMock = vi.fn().mockResolvedValue(
61
+ new Response(JSON.stringify({ error: { message: "InvalidRecipient" } }), {
62
+ status: 400,
63
+ statusText: "Bad Request",
64
+ }),
65
+ );
66
+ globalThis.fetch = fetchMock as unknown as typeof fetch;
67
+
68
+ await expect(
69
+ sendMessage({
70
+ to: ["test@example.com"],
71
+ subject: "test",
72
+ body: "test body",
73
+ }),
74
+ ).rejects.toThrow(/Graph API .* failed \(400\)/);
75
+ });
76
+ });
@@ -38,10 +38,15 @@ async function graphFetch<T>(path: string, init?: RequestInit): Promise<T> {
38
38
  const text = await response.text().catch(() => "");
39
39
  throw new Error(`Graph API ${path} failed (${response.status}): ${text || "unknown error"}`);
40
40
  }
41
- if (response.status === 204) {
41
+ // Microsoft Graph returns 202 Accepted (empty body) for action endpoints
42
+ // like /me/sendMail and /me/messages/{id}/reply, and 204 No Content for
43
+ // others. Read the body as text first so any no-body success status
44
+ // resolves to {} instead of throwing "Unexpected end of JSON input".
45
+ const text = await response.text();
46
+ if (!text) {
42
47
  return {} as T;
43
48
  }
44
- return (await response.json()) as T;
49
+ return JSON.parse(text) as T;
45
50
  }
46
51
 
47
52
  export async function listMessages(params?: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symerian/symi",
3
- "version": "3.5.2",
3
+ "version": "3.5.4",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/jaysteelmind/symi#readme",