@symerian/symi 3.5.28 → 3.5.30

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.28",
3
- "commit": "db77a7b3e11dc5e68b8ac144a5146189b3d4137b",
4
- "builtAt": "2026-05-25T03:25:14.935Z"
2
+ "version": "3.5.30",
3
+ "commit": "8474399342f1d5220e24fd2dd782588816ed7570",
4
+ "builtAt": "2026-05-25T03:50:11.739Z"
5
5
  }
@@ -1 +1 @@
1
- 29f188669cbdca0c4565999685335daee91fdf3055df4d6905794fc46aef67f0
1
+ 00290700f4d365ddae900c64b6bf347009972f71c748b3b22b5075832f35b846
@@ -9,7 +9,7 @@ import fs$1 from "node:fs/promises";
9
9
  import { execFileSync, spawn } from "node:child_process";
10
10
  import net from "node:net";
11
11
  import { createServer } from "node:http";
12
- import WebSocket$1, { WebSocketServer } from "ws";
12
+ import WebSocket, { WebSocketServer } from "ws";
13
13
  import { Buffer as Buffer$1 } from "node:buffer";
14
14
 
15
15
  //#region src/browser/constants.ts
@@ -177,7 +177,7 @@ async function ensureChromeExtensionRelayServer(opts) {
177
177
  let nextExtensionId = 1;
178
178
  const sendToExtension = async (payload) => {
179
179
  const ws = extensionWs;
180
- if (!ws || ws.readyState !== WebSocket$1.OPEN) throw new Error("Chrome extension not connected");
180
+ if (!ws || ws.readyState !== WebSocket.OPEN) throw new Error("Chrome extension not connected");
181
181
  ws.send(JSON.stringify(payload));
182
182
  return await new Promise((resolve, reject) => {
183
183
  const timer = setTimeout(() => {
@@ -194,12 +194,12 @@ async function ensureChromeExtensionRelayServer(opts) {
194
194
  const broadcastToCdpClients = (evt) => {
195
195
  const msg = JSON.stringify(evt);
196
196
  for (const ws of cdpClients) {
197
- if (ws.readyState !== WebSocket$1.OPEN) continue;
197
+ if (ws.readyState !== WebSocket.OPEN) continue;
198
198
  ws.send(msg);
199
199
  }
200
200
  };
201
201
  const sendResponseToCdp = (ws, res) => {
202
- if (ws.readyState !== WebSocket$1.OPEN) return;
202
+ if (ws.readyState !== WebSocket.OPEN) return;
203
203
  ws.send(JSON.stringify(res));
204
204
  };
205
205
  const ensureTargetEventsForClient = (ws, mode) => {
@@ -424,7 +424,7 @@ async function ensureChromeExtensionRelayServer(opts) {
424
424
  wssExtension.on("connection", (ws) => {
425
425
  extensionWs = ws;
426
426
  const ping = setInterval(() => {
427
- if (ws.readyState !== WebSocket$1.OPEN) return;
427
+ if (ws.readyState !== WebSocket.OPEN) return;
428
428
  ws.send(JSON.stringify({ method: "ping" }));
429
429
  }, 5e3);
430
430
  ws.on("message", (data) => {
@@ -742,7 +742,7 @@ async function fetchOk(url, timeoutMs = 1500, init) {
742
742
  }
743
743
  async function withCdpSocket(wsUrl, fn, opts) {
744
744
  const headers = getHeadersWithAuth(wsUrl, opts?.headers ?? {});
745
- const ws = new WebSocket$1(wsUrl, {
745
+ const ws = new WebSocket(wsUrl, {
746
746
  handshakeTimeout: typeof opts?.handshakeTimeoutMs === "number" && Number.isFinite(opts.handshakeTimeoutMs) ? Math.max(1, Math.floor(opts.handshakeTimeoutMs)) : 5e3,
747
747
  ...Object.keys(headers).length ? { headers } : {}
748
748
  });
@@ -1636,7 +1636,7 @@ async function getChromeWebSocketUrl(cdpUrl, timeoutMs = 500) {
1636
1636
  async function canOpenWebSocket(wsUrl, timeoutMs = 800) {
1637
1637
  return await new Promise((resolve) => {
1638
1638
  const headers = getHeadersWithAuth(wsUrl);
1639
- const ws = new WebSocket$1(wsUrl, {
1639
+ const ws = new WebSocket(wsUrl, {
1640
1640
  handshakeTimeout: timeoutMs,
1641
1641
  ...Object.keys(headers).length ? { headers } : {}
1642
1642
  });
@@ -853,23 +853,24 @@ body {
853
853
  the now-removed reasoning panel up into the header row, where it
854
854
  still pulses on agent activity (app.js:840-845 untouched, single id
855
855
  continues to bind that semantic). */
856
- /* Stage C.4 (3.5.25): switched the symframe from flex to grid. The
857
- flex-based layout (flex: 1 1 0 + min-height: 0 + child grid
858
- overflow: hidden) intermittently failed to bound the substrate's
859
- intrinsic content size observed on real hardware where the
860
- substrate's reasoning entries still pushed the AWAITING footer
861
- past the viewport.
862
-
863
- Grid handles the "auto-row + 1fr-row + auto-row" pattern natively:
864
- the 1fr row is constrained to whatever space remains after the
865
- two auto rows resolve. There's no flex-basis-vs-content-size
866
- negotiation to get wrong. The grid track shrinks to fit and the
867
- substrate's overflow-y reliably engages. */
856
+ /* Stage C.4 (3.5.25) + Stage D.3 (3.5.30) revision: the symframe is
857
+ a grid container (rows: header / stack / footer) sized to fill its
858
+ metrics-col flex parent. The two key sizing primitives:
859
+ - flex: 1 1 0 + min-height: 0 on the symframe itself ensures the
860
+ grid container has a *definite* height inside the flex column
861
+ parent. Without this, `height: 100%` was unreliable across
862
+ browsers + modes (modes 2-4 overflow report from 3.5.29).
863
+ - minmax(0, 1fr) on the flex middle row (instead of plain 1fr)
864
+ explicitly allows the row to shrink below its content size,
865
+ which lets the substrate / cards container's overflow-y: auto
866
+ reliably engage instead of pushing the parent.
867
+ Combined: every mode reliably bounds to the column. */
868
868
  .symframe {
869
869
  display: grid;
870
- grid-template-rows: auto 1fr auto;
870
+ grid-template-rows: auto minmax(0, 1fr) auto;
871
871
  gap: 8px;
872
- height: 100%;
872
+ flex: 1 1 0;
873
+ min-height: 0;
873
874
  overflow: hidden;
874
875
  }
875
876
  .symframe-header {
@@ -1084,7 +1085,10 @@ body {
1084
1085
  foreground card takes the visual stage. If a focusedId is set, the
1085
1086
  matching card gets a cyan halo + others fade out. */
1086
1087
  .symframe[data-mode="focus"] {
1087
- grid-template-rows: auto 1fr 0;
1088
+ /* Stage D.3: minmax(0, 1fr) so the middle row can shrink below
1089
+ content size and the cards container's overflow-y: auto engages
1090
+ instead of expanding the row. */
1091
+ grid-template-rows: auto minmax(0, 1fr) 0;
1088
1092
  }
1089
1093
  .symframe[data-mode="focus"] .symframe-awaiting {
1090
1094
  display: none;
@@ -1111,24 +1115,45 @@ body {
1111
1115
  them, so we use a generic "the card whose id matches" pattern via
1112
1116
  :has() (when supported) plus a fallback class added by JS. */
1113
1117
  .symframe[data-mode="focus"] .symframe-card-focused {
1118
+ /* Stage D.2: dropped `transform: scale(1.02)` — the scaled render
1119
+ area extends beyond the card's layout box and can leak past the
1120
+ cards container's overflow boundary. The halo + cyan border are
1121
+ plenty of focus signal on their own. */
1114
1122
  opacity: 1 !important;
1115
1123
  box-shadow:
1116
1124
  0 0 24px rgba(0, 212, 255, 0.35),
1117
1125
  inset 0 1px 0 rgba(255, 255, 255, 0.06),
1118
1126
  0 4px 12px rgba(0, 0, 0, 0.25);
1119
1127
  border-color: var(--accent-cyan) !important;
1120
- transform: scale(1.02);
1121
- transform-origin: center;
1122
1128
  transition:
1123
1129
  box-shadow 0.4s ease,
1124
- border-color 0.4s ease,
1125
- transform 0.4s ease;
1130
+ border-color 0.4s ease;
1126
1131
  }
1127
1132
 
1128
1133
  /* Awaiting mode: footer dominant; cards collapse to title strips;
1129
- substrate dims to a status band. */
1134
+ substrate dims to a status band.
1135
+
1136
+ Stage D.2 fix (3.5.29): the original Stage D rules removed
1137
+ max-height on .symframe-awaiting and .awaiting-list to let the
1138
+ footer dominate — but with `display: flex; flex-direction: column`
1139
+ on .symframe-awaiting, the internal flex children (header / list /
1140
+ button) couldn't size correctly: the list had no flex-grow so it
1141
+ stayed at intrinsic content size, and the footer grew past its
1142
+ grid cell when the list was long. The list's content overflowed
1143
+ the column via the cascade.
1144
+
1145
+ The fix: keep .symframe-awaiting capped at 80% of the column
1146
+ (was max-height: 40% in Stage C.4 — bumped for the awaiting mode
1147
+ posture), and turn .awaiting-list into a flex: 1 0 0 child that
1148
+ scrolls internally when its content exceeds the now-larger footer.
1149
+ */
1130
1150
  .symframe[data-mode="awaiting"] {
1131
- grid-template-rows: auto minmax(60px, 1fr) 4fr;
1151
+ /* Stage D.3: minmax(0, 1fr) on substrate so it can shrink (and
1152
+ scroll internally) when awaiting takes most of the column.
1153
+ `auto` on the footer row + max-height: 80% on .symframe-awaiting
1154
+ bounds it; `overflow: hidden` on the footer clips any overflow
1155
+ from its inner list (which has its own overflow-y: auto). */
1156
+ grid-template-rows: auto minmax(0, 1fr) auto;
1132
1157
  }
1133
1158
  .symframe[data-mode="awaiting"] .symframe-substrate {
1134
1159
  opacity: 0.35;
@@ -1145,19 +1170,28 @@ body {
1145
1170
  display: none;
1146
1171
  }
1147
1172
  .symframe[data-mode="awaiting"] .symframe-awaiting {
1148
- max-height: none;
1173
+ /* Bump from C.4's 40% baseline cap to 80% so the footer can be
1174
+ "dominant" without exceeding the column. The `overflow: hidden`
1175
+ from C.4 still clips any overflow from misbehaving children. */
1176
+ max-height: 80%;
1149
1177
  background: rgba(0, 212, 255, 0.04);
1150
1178
  border-radius: 10px;
1151
1179
  margin-top: 8px;
1152
1180
  }
1153
1181
  .symframe[data-mode="awaiting"] .awaiting-list {
1182
+ /* The footer is now sized larger than baseline. Let the list flex
1183
+ to fill it AND scroll internally if items exceed the cell. */
1154
1184
  max-height: none;
1185
+ flex: 1 1 0;
1186
+ min-height: 0;
1155
1187
  }
1156
1188
 
1157
1189
  /* Quiet mode: only the substrate breathes. Cards + AWAITING hidden.
1158
- This is the "deep think" or "nothing to surface" posture. */
1190
+ This is the "deep think" or "nothing to surface" posture.
1191
+ Stage D.3: minmax(0, 1fr) so the substrate can shrink below
1192
+ content size and scroll internally. */
1159
1193
  .symframe[data-mode="quiet"] {
1160
- grid-template-rows: auto 1fr;
1194
+ grid-template-rows: auto minmax(0, 1fr);
1161
1195
  }
1162
1196
  .symframe[data-mode="quiet"] .symframe-cards,
1163
1197
  .symframe[data-mode="quiet"] .symframe-awaiting {
@@ -9,7 +9,7 @@ import { r as normalizeChannelId, t as getChannelPlugin } from "./plugins-CZ_mYw
9
9
  import { _ as listDeliverableMessageChannels, c as resolveChunkMode, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, n as chunkByParagraph, v as normalizeMessageChannel } from "./chunk-CAZujdOi.js";
10
10
  import { c as loadConfig, d as writeConfigFile, m as parseByteSize, p as parseDurationMs, s as createConfigIO, t as SsrFBlockedError } from "./ssrf-BCSnhba8.js";
11
11
  import { t as parseBooleanValue } from "./boolean-BW6OTjPi.js";
12
- import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-DNssqQJs.js";
12
+ import { A as DEFAULT_BROWSER_EVALUATE_ENABLED, D as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS, E as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH, M as DEFAULT_SYMI_BROWSER_ENABLED, N as DEFAULT_SYMI_BROWSER_PROFILE_NAME, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, S as stopChromeExtensionRelayServer, _ as fetchJson, a as resolveSymiUserDataDir, c as captureScreenshot, d as normalizeCdpWsUrl, f as snapshotAria, g as appendCdpPath, h as withBrowserNavigationPolicy, i as launchSymiChrome, j as DEFAULT_SYMI_BROWSER_COLOR, k as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME, l as createTargetViaCdp, m as assertBrowserNavigationAllowed, n as isChromeCdpReady, o as stopSymiChrome, p as InvalidBrowserNavigationUrlError, r as isChromeReachable, s as resolveBrowserExecutableForPlatform, v as fetchOk, w as isLoopbackHost, x as ensureChromeExtensionRelayServer } from "./chrome-3jl2ulOE.js";
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-v__CyAlM.js");
1334
+ return await import("./pw-ai-DOAsQ5NX.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-v__CyAlM.js")).closePlaywrightBrowserConnection();
3931
+ await (await import("./pw-ai-DOAsQ5NX.js")).closePlaywrightBrowserConnection();
3932
3932
  } catch {}
3933
3933
  if (profileState.running) await stopRunningBrowser();
3934
3934
  try {
3935
- await (await import("./pw-ai-v__CyAlM.js")).closePlaywrightBrowserConnection();
3935
+ await (await import("./pw-ai-DOAsQ5NX.js")).closePlaywrightBrowserConnection();
3936
3936
  } catch {}
3937
3937
  if (!fs.existsSync(userDataDir)) return {
3938
3938
  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-0nzkXt6o.js";
9
- import { a as resolveAgentTimeoutMs, r as runEmbeddedPiAgent } from "./pi-embedded-V-5MAZNb.js";
10
- import { $ as loadSessionStore, nt as saveSessionStore } from "./deliver-q23ar_Pm.js";
9
+ import { a as resolveAgentTimeoutMs, r as runEmbeddedPiAgent } from "./pi-embedded-DdoLFoXg.js";
10
+ import { $ as loadSessionStore, nt as saveSessionStore } from "./deliver-f3cIWxXT.js";
11
11
  import "./diagnostic-BdRnGknC.js";
12
12
  import "./diagnostic-session-state-DpxCUzoM.js";
13
13
  import "./chunk-CAZujdOi.js";
@@ -16,14 +16,14 @@ import "./ssrf-BCSnhba8.js";
16
16
  import "./boolean-BW6OTjPi.js";
17
17
  import "./shell-env-DgjeObDZ.js";
18
18
  import "./manifest-registry-CAWGTwb5.js";
19
- import "./chrome-DNssqQJs.js";
19
+ import "./chrome-3jl2ulOE.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-NDn8AFhr.js";
26
+ import "./manager-DogrTmEo.js";
27
27
  import "./github-copilot-token-dYUr1mDQ.js";
28
28
  import "./sqlite-D8iYC_CU.js";
29
29
  import "./markdown-tables-jQzXAsf3.js";
@@ -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-BfVWACNx.js")]);
4452
+ const [{ runL3Cycle, runL3CycleIfDue }, { createSynthesizer }] = await Promise.all([import("./consolidate-CwJCvaOH.js"), import("./synthesis-Cggd0_wq.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-0nzkXt6o.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-q23ar_Pm.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-f3cIWxXT.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-DNssqQJs.js";
21
+ import { C as rawDataToString, O as DEFAULT_AI_SNAPSHOT_MAX_CHARS, T as isSecureWebSocketUrl, x as ensureChromeExtensionRelayServer } from "./chrome-3jl2ulOE.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-NDn8AFhr.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-DogrTmEo.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 } from "ws";
56
+ import { WebSocket as WebSocket$1 } 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-NDn8AFhr.js").then((n) => n.t);
3393
+ const { MemoryIndexManager } = await import("./manager-DogrTmEo.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-NDn8AFhr.js").then((n) => n.t);
3406
+ const { MemoryIndexManager } = await import("./manager-DogrTmEo.js").then((n) => n.t);
3407
3407
  return { manager: await MemoryIndexManager.get(params) };
3408
3408
  } catch (err) {
3409
3409
  return {
@@ -5968,7 +5968,7 @@ var GatewayClient = class {
5968
5968
  if (fingerprint !== expected) return /* @__PURE__ */ new Error("gateway tls fingerprint mismatch");
5969
5969
  });
5970
5970
  }
5971
- this.ws = new WebSocket(url, wsOptions);
5971
+ this.ws = new WebSocket$1(url, wsOptions);
5972
5972
  this.ws.on("open", () => {
5973
5973
  if (url.startsWith("wss://") && this.opts.tlsFingerprint) {
5974
5974
  const tlsError = this.validateTlsFingerprint();
@@ -6187,7 +6187,7 @@ var GatewayClient = class {
6187
6187
  return null;
6188
6188
  }
6189
6189
  async request(method, params, opts) {
6190
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error("gateway not connected");
6190
+ if (!this.ws || this.ws.readyState !== WebSocket$1.OPEN) throw new Error("gateway not connected");
6191
6191
  const id = randomUUID();
6192
6192
  const frame = {
6193
6193
  type: "req",
@@ -7137,7 +7137,7 @@ async function routeReply(params) {
7137
7137
  const resolvedReplyToId = replyToId ?? (channelId === "slack" && threadId != null && threadId !== "" ? String(threadId) : void 0);
7138
7138
  const resolvedThreadId = channelId === "slack" ? null : threadId ?? null;
7139
7139
  try {
7140
- const { deliverOutboundPayloads } = await import("./deliver-q23ar_Pm.js").then((n) => n.n);
7140
+ const { deliverOutboundPayloads } = await import("./deliver-f3cIWxXT.js").then((n) => n.n);
7141
7141
  return {
7142
7142
  ok: true,
7143
7143
  messageId: (await deliverOutboundPayloads({
@@ -42334,7 +42334,7 @@ async function deliverSessionMaintenanceWarning(params) {
42334
42334
  return;
42335
42335
  }
42336
42336
  try {
42337
- const { deliverOutboundPayloads } = await import("./deliver-q23ar_Pm.js").then((n) => n.n);
42337
+ const { deliverOutboundPayloads } = await import("./deliver-f3cIWxXT.js").then((n) => n.n);
42338
42338
  await deliverOutboundPayloads({
42339
42339
  cfg: params.cfg,
42340
42340
  channel,
@@ -7,7 +7,7 @@ import "./ssrf-BCSnhba8.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-DNssqQJs.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-3jl2ulOE.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";
@@ -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-0nzkXt6o.js";
9
- import { n as runAgentTurn } from "./pi-embedded-V-5MAZNb.js";
10
- import "./deliver-q23ar_Pm.js";
9
+ import { n as runAgentTurn } from "./pi-embedded-DdoLFoXg.js";
10
+ import "./deliver-f3cIWxXT.js";
11
11
  import "./diagnostic-BdRnGknC.js";
12
12
  import "./diagnostic-session-state-DpxCUzoM.js";
13
13
  import "./chunk-CAZujdOi.js";
@@ -16,14 +16,14 @@ import "./ssrf-BCSnhba8.js";
16
16
  import "./boolean-BW6OTjPi.js";
17
17
  import "./shell-env-DgjeObDZ.js";
18
18
  import "./manifest-registry-CAWGTwb5.js";
19
- import "./chrome-DNssqQJs.js";
19
+ import "./chrome-3jl2ulOE.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-NDn8AFhr.js";
26
+ import "./manager-DogrTmEo.js";
27
27
  import "./github-copilot-token-dYUr1mDQ.js";
28
28
  import "./sqlite-D8iYC_CU.js";
29
29
  import "./markdown-tables-jQzXAsf3.js";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/memory-core",
3
- "version": "3.5.28",
3
+ "version": "3.5.30",
4
4
  "private": true,
5
5
  "description": "Symi core memory search plugin",
6
6
  "type": "module",
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.5.30
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core Symi release numbers.
8
+
9
+ ## 3.5.29
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core Symi release numbers.
14
+
3
15
  ## 3.5.28
4
16
 
5
17
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/msteams",
3
- "version": "3.5.28",
3
+ "version": "3.5.30",
4
4
  "description": "Symi Microsoft Teams channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/open-prose",
3
- "version": "3.5.28",
3
+ "version": "3.5.30",
4
4
  "private": true,
5
5
  "description": "OpenProse VM skill pack plugin (slash command + telemetry).",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/outlook",
3
- "version": "3.5.28",
3
+ "version": "3.5.30",
4
4
  "private": true,
5
5
  "description": "Symi Outlook 365 email integration via Microsoft Graph API",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symi/slack",
3
- "version": "3.5.28",
3
+ "version": "3.5.30",
4
4
  "private": true,
5
5
  "description": "Symi Slack channel plugin",
6
6
  "type": "module",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symerian/symi",
3
- "version": "3.5.28",
3
+ "version": "3.5.30",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/jaysteelmind/symi#readme",