@symerian/symi 2.8.5 → 2.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/{audio-preflight-DIXDvyz5.js → audio-preflight-D0nJ1LEt.js} +4 -4
  2. package/dist/{audio-preflight-lr-WPpc9.js → audio-preflight-D_g9Duqw.js} +4 -4
  3. package/dist/build-info.json +3 -3
  4. package/dist/bundled/boot-md/handler.js +6 -6
  5. package/dist/bundled/session-memory/handler.js +6 -6
  6. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  7. package/dist/{chrome-B14NNyfm.js → chrome-BUT--ob3.js} +7 -7
  8. package/dist/{chrome-ROtrXlNs.js → chrome-C08Z0XAa.js} +7 -7
  9. package/dist/control-ui/js/app.js +27 -7
  10. package/dist/control-ui/js/render.js +58 -0
  11. package/dist/{deliver-DrC7tG6s.js → deliver-B36OzmeP.js} +1 -1
  12. package/dist/{deliver-BC3liFsT.js → deliver-CLZGlRZt.js} +1 -1
  13. package/dist/extensionAPI.js +6 -6
  14. package/dist/{image-CKeN0xJL.js → image-BHhzdmbq.js} +1 -1
  15. package/dist/{image-C6v6m8Id.js → image-BnO8X_hj.js} +1 -1
  16. package/dist/llm-slug-generator.js +6 -6
  17. package/dist/{pi-embedded-BIATvD3R.js → pi-embedded-BaNpG0Aq.js} +16 -16
  18. package/dist/{pi-embedded-helpers-D8YgtMdl.js → pi-embedded-helpers-BET359cH.js} +4 -4
  19. package/dist/{pi-embedded-helpers-BUNbSNWw.js → pi-embedded-helpers-DcN8GHTt.js} +4 -4
  20. package/dist/{pw-ai-BLrC_W1X.js → pw-ai-B476LzSK.js} +1 -1
  21. package/dist/{pw-ai-DTmHAKPA.js → pw-ai-DE8wmtet.js} +1 -1
  22. package/dist/{runner-COpebDew.js → runner-BVgCl6yZ.js} +1 -1
  23. package/dist/{runner-QX0Z6K1w.js → runner-D5nFF9E6.js} +1 -1
  24. package/dist/{unified-runner-CUXcv08a.js → unified-runner-BojeuKIk.js} +16 -16
  25. package/dist/{web-DgoKLcMP.js → web-Dxkxcp7P.js} +6 -6
  26. package/dist/{web-Ifwqx6Dt.js → web-f1xT-H2y.js} +6 -6
  27. package/extensions/bluebubbles/package.json +1 -1
  28. package/extensions/copilot-proxy/package.json +1 -1
  29. package/extensions/diagnostics-otel/package.json +1 -1
  30. package/extensions/discord/package.json +1 -1
  31. package/extensions/feishu/package.json +1 -1
  32. package/extensions/google-antigravity-auth/package.json +1 -1
  33. package/extensions/google-gemini-cli-auth/package.json +1 -1
  34. package/extensions/googlechat/package.json +1 -1
  35. package/extensions/imessage/package.json +1 -1
  36. package/extensions/irc/package.json +1 -1
  37. package/extensions/learning-loop/package.json +1 -1
  38. package/extensions/line/package.json +1 -1
  39. package/extensions/llm-task/package.json +1 -1
  40. package/extensions/matrix/CHANGELOG.md +6 -0
  41. package/extensions/matrix/package.json +1 -1
  42. package/extensions/mattermost/package.json +1 -1
  43. package/extensions/memory-core/package.json +1 -1
  44. package/extensions/memory-lancedb/package.json +1 -1
  45. package/extensions/minimax-portal-auth/package.json +1 -1
  46. package/extensions/msteams/CHANGELOG.md +6 -0
  47. package/extensions/msteams/package.json +1 -1
  48. package/extensions/nextcloud-talk/package.json +1 -1
  49. package/extensions/nostr/CHANGELOG.md +6 -0
  50. package/extensions/nostr/package.json +1 -1
  51. package/extensions/open-prose/package.json +1 -1
  52. package/extensions/outlook/package.json +1 -1
  53. package/extensions/pipeline/package.json +1 -1
  54. package/extensions/signal/package.json +1 -1
  55. package/extensions/slack/package.json +1 -1
  56. package/extensions/telegram/package.json +1 -1
  57. package/extensions/tlon/package.json +1 -1
  58. package/extensions/twitch/CHANGELOG.md +6 -0
  59. package/extensions/twitch/package.json +1 -1
  60. package/extensions/voice-call/CHANGELOG.md +6 -0
  61. package/extensions/voice-call/package.json +1 -1
  62. package/extensions/whatsapp/package.json +1 -1
  63. package/extensions/zalo/CHANGELOG.md +6 -0
  64. package/extensions/zalo/package.json +1 -1
  65. package/extensions/zalouser/CHANGELOG.md +6 -0
  66. package/extensions/zalouser/package.json +1 -1
  67. package/package.json +1 -1
@@ -8,10 +8,10 @@ import "./auth-profiles-C2vj6htZ.js";
8
8
  import "./env-BDXYbTKj.js";
9
9
  import "./github-copilot-token-cCYzSU9h.js";
10
10
  import "./boolean-CE7i9tBR.js";
11
- import "./pi-embedded-helpers-BUNbSNWw.js";
11
+ import "./pi-embedded-helpers-DcN8GHTt.js";
12
12
  import "./config-BkZ9HOKT.js";
13
13
  import "./manifest-registry-CBCGTsIb.js";
14
- import "./chrome-ROtrXlNs.js";
14
+ import "./chrome-C08Z0XAa.js";
15
15
  import "./frontmatter-CTR5f_Ez.js";
16
16
  import "./skills-CXxrn_e2.js";
17
17
  import "./redact-BDMXB06K.js";
@@ -27,11 +27,11 @@ import "./accounts-3dCrO3oZ.js";
27
27
  import "./accounts-BuZxOb3B.js";
28
28
  import "./bindings-BsHoBLIE.js";
29
29
  import "./tool-images-SqqWIT22.js";
30
- import "./image-C6v6m8Id.js";
30
+ import "./image-BnO8X_hj.js";
31
31
  import "./pi-model-discovery-CuZX_Q4t.js";
32
32
  import "./gemini-auth-BefM10YB.js";
33
33
  import "./local-roots-Se92wAN5.js";
34
- import { a as resolveMediaAttachmentLocalRoots, n as createMediaAttachmentCache, o as runCapability, r as normalizeMediaAttachments, t as buildProviderRegistry, u as isAudioAttachment } from "./runner-QX0Z6K1w.js";
34
+ import { a as resolveMediaAttachmentLocalRoots, n as createMediaAttachmentCache, o as runCapability, r as normalizeMediaAttachments, t as buildProviderRegistry, u as isAudioAttachment } from "./runner-D5nFF9E6.js";
35
35
 
36
36
  //#region src/media-understanding/audio-preflight.ts
37
37
  /**
@@ -12,10 +12,10 @@ import "./accounts-8zZqL37v.js";
12
12
  import "./image-ops-ByaQt43P.js";
13
13
  import "./pi-model-discovery-j5tVLINv.js";
14
14
  import "./message-channel-BQINJQIT.js";
15
- import "./pi-embedded-helpers-D8YgtMdl.js";
15
+ import "./pi-embedded-helpers-BET359cH.js";
16
16
  import "./config-BAVNLbja.js";
17
17
  import "./manifest-registry-DWdYdchb.js";
18
- import "./chrome-B14NNyfm.js";
18
+ import "./chrome-BUT--ob3.js";
19
19
  import "./skills-XEbTRNYL.js";
20
20
  import "./redact-1NGYV_8p.js";
21
21
  import "./errors-CPfngF0S.js";
@@ -25,10 +25,10 @@ import "./thinking-W85Rb32m.js";
25
25
  import "./accounts-DImOt9jX.js";
26
26
  import "./paths-DkMamAQ-.js";
27
27
  import "./tool-images-ChC2CXaN.js";
28
- import "./image-CKeN0xJL.js";
28
+ import "./image-BHhzdmbq.js";
29
29
  import "./gemini-auth-DVcG-42i.js";
30
30
  import "./local-roots-CC8jiKDk.js";
31
- import { a as resolveMediaAttachmentLocalRoots, n as createMediaAttachmentCache, o as runCapability, r as normalizeMediaAttachments, t as buildProviderRegistry, u as isAudioAttachment } from "./runner-COpebDew.js";
31
+ import { a as resolveMediaAttachmentLocalRoots, n as createMediaAttachmentCache, o as runCapability, r as normalizeMediaAttachments, t as buildProviderRegistry, u as isAudioAttachment } from "./runner-BVgCl6yZ.js";
32
32
 
33
33
  //#region src/media-understanding/audio-preflight.ts
34
34
  /**
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.8.5",
3
- "commit": "b234605a8b8b70c4383aba3de8c2d4ab2f8d94f4",
4
- "builtAt": "2026-04-22T06:45:45.463Z"
2
+ "version": "2.8.6",
3
+ "commit": "a073cb8942389b7e22263538e2d7661297c10f87",
4
+ "builtAt": "2026-04-22T06:55:19.272Z"
5
5
  }
@@ -4,16 +4,16 @@ import { b as isGatewayStartupEvent } from "../../registry-DYq1AYOv.js";
4
4
  import { s as resolveAgentWorkspaceDir, t as listAgentIds } from "../../agent-scope-CpEJ0B88.js";
5
5
  import { r as defaultRuntime, t as createSubsystemLogger } from "../../subsystem-BjyjJF-d.js";
6
6
  import "../../workspace-DscDraUb.js";
7
- import { a as createDefaultDeps, i as agentCommand } from "../../unified-runner-CUXcv08a.js";
7
+ import { a as createDefaultDeps, i as agentCommand } from "../../unified-runner-BojeuKIk.js";
8
8
  import { s as resolveStorePath } from "../../paths-CbQV9WEg.js";
9
9
  import "../../auth-profiles-C2vj6htZ.js";
10
10
  import "../../env-BDXYbTKj.js";
11
11
  import "../../github-copilot-token-cCYzSU9h.js";
12
12
  import "../../boolean-CE7i9tBR.js";
13
- import { H as loadSessionStore, K as updateSessionStore, xt as resolveMainSessionKey, yt as resolveAgentMainSessionKey } from "../../pi-embedded-helpers-BUNbSNWw.js";
13
+ import { H as loadSessionStore, K as updateSessionStore, xt as resolveMainSessionKey, yt as resolveAgentMainSessionKey } from "../../pi-embedded-helpers-DcN8GHTt.js";
14
14
  import "../../config-BkZ9HOKT.js";
15
15
  import "../../manifest-registry-CBCGTsIb.js";
16
- import "../../chrome-ROtrXlNs.js";
16
+ import "../../chrome-C08Z0XAa.js";
17
17
  import "../../frontmatter-CTR5f_Ez.js";
18
18
  import "../../skills-CXxrn_e2.js";
19
19
  import "../../redact-BDMXB06K.js";
@@ -31,10 +31,10 @@ import "../../bindings-BsHoBLIE.js";
31
31
  import "../../send-B7aHpAco.js";
32
32
  import "../../send-Yzy50T1h.js";
33
33
  import "../../tool-images-SqqWIT22.js";
34
- import "../../deliver-BC3liFsT.js";
34
+ import "../../deliver-CLZGlRZt.js";
35
35
  import "../../diagnostic-CQiU0O8b.js";
36
36
  import "../../diagnostic-session-state-Zw87xFym.js";
37
- import "../../image-C6v6m8Id.js";
37
+ import "../../image-BnO8X_hj.js";
38
38
  import "../../pi-auth-json-RXOlh8ar.js";
39
39
  import { n as SILENT_REPLY_TOKEN } from "../../tokens-W0JzCJJM.js";
40
40
  import "../../send-xTfsDEE2.js";
@@ -51,7 +51,7 @@ import "../../local-roots-Se92wAN5.js";
51
51
  import "../../ir-JAy_3A3B.js";
52
52
  import "../../render-DwEu-aCr.js";
53
53
  import "../../commands-registry-CfoYlMQB.js";
54
- import "../../runner-QX0Z6K1w.js";
54
+ import "../../runner-D5nFF9E6.js";
55
55
  import "../../skill-commands-D1hG6Ikz.js";
56
56
  import "../../fetch-Dnti0cFs.js";
57
57
  import "../../channel-activity-D-kw83R0.js";
@@ -4,16 +4,16 @@ import "../../registry-DYq1AYOv.js";
4
4
  import { s as resolveAgentWorkspaceDir } from "../../agent-scope-CpEJ0B88.js";
5
5
  import { t as createSubsystemLogger } from "../../subsystem-BjyjJF-d.js";
6
6
  import "../../workspace-DscDraUb.js";
7
- import "../../unified-runner-CUXcv08a.js";
7
+ import "../../unified-runner-BojeuKIk.js";
8
8
  import "../../paths-CbQV9WEg.js";
9
9
  import "../../auth-profiles-C2vj6htZ.js";
10
10
  import "../../env-BDXYbTKj.js";
11
11
  import "../../github-copilot-token-cCYzSU9h.js";
12
12
  import "../../boolean-CE7i9tBR.js";
13
- import { ct as hasInterSessionUserProvenance } from "../../pi-embedded-helpers-BUNbSNWw.js";
13
+ import { ct as hasInterSessionUserProvenance } from "../../pi-embedded-helpers-DcN8GHTt.js";
14
14
  import "../../config-BkZ9HOKT.js";
15
15
  import "../../manifest-registry-CBCGTsIb.js";
16
- import "../../chrome-ROtrXlNs.js";
16
+ import "../../chrome-C08Z0XAa.js";
17
17
  import "../../frontmatter-CTR5f_Ez.js";
18
18
  import "../../skills-CXxrn_e2.js";
19
19
  import "../../redact-BDMXB06K.js";
@@ -31,10 +31,10 @@ import "../../bindings-BsHoBLIE.js";
31
31
  import "../../send-B7aHpAco.js";
32
32
  import "../../send-Yzy50T1h.js";
33
33
  import "../../tool-images-SqqWIT22.js";
34
- import "../../deliver-BC3liFsT.js";
34
+ import "../../deliver-CLZGlRZt.js";
35
35
  import "../../diagnostic-CQiU0O8b.js";
36
36
  import "../../diagnostic-session-state-Zw87xFym.js";
37
- import "../../image-C6v6m8Id.js";
37
+ import "../../image-BnO8X_hj.js";
38
38
  import "../../pi-auth-json-RXOlh8ar.js";
39
39
  import "../../tokens-W0JzCJJM.js";
40
40
  import "../../send-xTfsDEE2.js";
@@ -51,7 +51,7 @@ import "../../local-roots-Se92wAN5.js";
51
51
  import "../../ir-JAy_3A3B.js";
52
52
  import "../../render-DwEu-aCr.js";
53
53
  import "../../commands-registry-CfoYlMQB.js";
54
- import "../../runner-QX0Z6K1w.js";
54
+ import "../../runner-D5nFF9E6.js";
55
55
  import "../../skill-commands-D1hG6Ikz.js";
56
56
  import "../../fetch-Dnti0cFs.js";
57
57
  import "../../channel-activity-D-kw83R0.js";
@@ -1 +1 @@
1
- aa0296c8acf93d4ce4f9d343586fc7bd60152a087de5e7399e450fbd2eaea036
1
+ dbcc112c4fdc98ecf0a5ba9bdd05eb52b7b609d8b3445bc9a35d0aa1c53142bd
@@ -10,7 +10,7 @@ import fs$1 from "node:fs/promises";
10
10
  import { execFileSync, spawn } from "node:child_process";
11
11
  import net from "node:net";
12
12
  import { createServer } from "node:http";
13
- import WebSocket, { WebSocketServer } from "ws";
13
+ import WebSocket$1, { WebSocketServer } from "ws";
14
14
  import { Buffer as Buffer$1 } from "node:buffer";
15
15
 
16
16
  //#region src/browser/constants.ts
@@ -178,7 +178,7 @@ async function ensureChromeExtensionRelayServer(opts) {
178
178
  let nextExtensionId = 1;
179
179
  const sendToExtension = async (payload) => {
180
180
  const ws = extensionWs;
181
- if (!ws || ws.readyState !== WebSocket.OPEN) throw new Error("Chrome extension not connected");
181
+ if (!ws || ws.readyState !== WebSocket$1.OPEN) throw new Error("Chrome extension not connected");
182
182
  ws.send(JSON.stringify(payload));
183
183
  return await new Promise((resolve, reject) => {
184
184
  const timer = setTimeout(() => {
@@ -195,12 +195,12 @@ async function ensureChromeExtensionRelayServer(opts) {
195
195
  const broadcastToCdpClients = (evt) => {
196
196
  const msg = JSON.stringify(evt);
197
197
  for (const ws of cdpClients) {
198
- if (ws.readyState !== WebSocket.OPEN) continue;
198
+ if (ws.readyState !== WebSocket$1.OPEN) continue;
199
199
  ws.send(msg);
200
200
  }
201
201
  };
202
202
  const sendResponseToCdp = (ws, res) => {
203
- if (ws.readyState !== WebSocket.OPEN) return;
203
+ if (ws.readyState !== WebSocket$1.OPEN) return;
204
204
  ws.send(JSON.stringify(res));
205
205
  };
206
206
  const ensureTargetEventsForClient = (ws, mode) => {
@@ -425,7 +425,7 @@ async function ensureChromeExtensionRelayServer(opts) {
425
425
  wssExtension.on("connection", (ws) => {
426
426
  extensionWs = ws;
427
427
  const ping = setInterval(() => {
428
- if (ws.readyState !== WebSocket.OPEN) return;
428
+ if (ws.readyState !== WebSocket$1.OPEN) return;
429
429
  ws.send(JSON.stringify({ method: "ping" }));
430
430
  }, 5e3);
431
431
  ws.on("message", (data) => {
@@ -743,7 +743,7 @@ async function fetchOk(url, timeoutMs = 1500, init) {
743
743
  }
744
744
  async function withCdpSocket(wsUrl, fn, opts) {
745
745
  const headers = getHeadersWithAuth(wsUrl, opts?.headers ?? {});
746
- const ws = new WebSocket(wsUrl, {
746
+ const ws = new WebSocket$1(wsUrl, {
747
747
  handshakeTimeout: typeof opts?.handshakeTimeoutMs === "number" && Number.isFinite(opts.handshakeTimeoutMs) ? Math.max(1, Math.floor(opts.handshakeTimeoutMs)) : 5e3,
748
748
  ...Object.keys(headers).length ? { headers } : {}
749
749
  });
@@ -1637,7 +1637,7 @@ async function getChromeWebSocketUrl(cdpUrl, timeoutMs = 500) {
1637
1637
  async function canOpenWebSocket(wsUrl, timeoutMs = 800) {
1638
1638
  return await new Promise((resolve) => {
1639
1639
  const headers = getHeadersWithAuth(wsUrl);
1640
- const ws = new WebSocket(wsUrl, {
1640
+ const ws = new WebSocket$1(wsUrl, {
1641
1641
  handshakeTimeout: timeoutMs,
1642
1642
  ...Object.keys(headers).length ? { headers } : {}
1643
1643
  });
@@ -10,7 +10,7 @@ import fs$1 from "node:fs/promises";
10
10
  import { execFileSync, spawn } from "node:child_process";
11
11
  import net from "node:net";
12
12
  import { createServer } from "node:http";
13
- import WebSocket, { WebSocketServer } from "ws";
13
+ import WebSocket$1, { WebSocketServer } from "ws";
14
14
  import { Buffer as Buffer$1 } from "node:buffer";
15
15
 
16
16
  //#region src/browser/constants.ts
@@ -178,7 +178,7 @@ async function ensureChromeExtensionRelayServer(opts) {
178
178
  let nextExtensionId = 1;
179
179
  const sendToExtension = async (payload) => {
180
180
  const ws = extensionWs;
181
- if (!ws || ws.readyState !== WebSocket.OPEN) throw new Error("Chrome extension not connected");
181
+ if (!ws || ws.readyState !== WebSocket$1.OPEN) throw new Error("Chrome extension not connected");
182
182
  ws.send(JSON.stringify(payload));
183
183
  return await new Promise((resolve, reject) => {
184
184
  const timer = setTimeout(() => {
@@ -195,12 +195,12 @@ async function ensureChromeExtensionRelayServer(opts) {
195
195
  const broadcastToCdpClients = (evt) => {
196
196
  const msg = JSON.stringify(evt);
197
197
  for (const ws of cdpClients) {
198
- if (ws.readyState !== WebSocket.OPEN) continue;
198
+ if (ws.readyState !== WebSocket$1.OPEN) continue;
199
199
  ws.send(msg);
200
200
  }
201
201
  };
202
202
  const sendResponseToCdp = (ws, res) => {
203
- if (ws.readyState !== WebSocket.OPEN) return;
203
+ if (ws.readyState !== WebSocket$1.OPEN) return;
204
204
  ws.send(JSON.stringify(res));
205
205
  };
206
206
  const ensureTargetEventsForClient = (ws, mode) => {
@@ -425,7 +425,7 @@ async function ensureChromeExtensionRelayServer(opts) {
425
425
  wssExtension.on("connection", (ws) => {
426
426
  extensionWs = ws;
427
427
  const ping = setInterval(() => {
428
- if (ws.readyState !== WebSocket.OPEN) return;
428
+ if (ws.readyState !== WebSocket$1.OPEN) return;
429
429
  ws.send(JSON.stringify({ method: "ping" }));
430
430
  }, 5e3);
431
431
  ws.on("message", (data) => {
@@ -743,7 +743,7 @@ async function fetchOk(url, timeoutMs = 1500, init) {
743
743
  }
744
744
  async function withCdpSocket(wsUrl, fn, opts) {
745
745
  const headers = getHeadersWithAuth(wsUrl, opts?.headers ?? {});
746
- const ws = new WebSocket(wsUrl, {
746
+ const ws = new WebSocket$1(wsUrl, {
747
747
  handshakeTimeout: typeof opts?.handshakeTimeoutMs === "number" && Number.isFinite(opts.handshakeTimeoutMs) ? Math.max(1, Math.floor(opts.handshakeTimeoutMs)) : 5e3,
748
748
  ...Object.keys(headers).length ? { headers } : {}
749
749
  });
@@ -1637,7 +1637,7 @@ async function getChromeWebSocketUrl(cdpUrl, timeoutMs = 500) {
1637
1637
  async function canOpenWebSocket(wsUrl, timeoutMs = 800) {
1638
1638
  return await new Promise((resolve) => {
1639
1639
  const headers = getHeadersWithAuth(wsUrl);
1640
- const ws = new WebSocket(wsUrl, {
1640
+ const ws = new WebSocket$1(wsUrl, {
1641
1641
  handshakeTimeout: timeoutMs,
1642
1642
  ...Object.keys(headers).length ? { headers } : {}
1643
1643
  });
@@ -376,10 +376,17 @@ function renderHistory(messages) {
376
376
  }
377
377
  responseArea.innerHTML = "";
378
378
  responseArea.prepend(loadMoreSentinel);
379
- for (const m of messages) {
380
- if (!m || !m.role) {
379
+ for (const rawM of messages) {
380
+ if (!rawM || !rawM.role) {
381
381
  continue;
382
382
  }
383
+ // 2.8.6: strip plugin banners + timestamp envelopes from user messages
384
+ // before any filtering or content checks. Clean text reveals whether the
385
+ // message was pure plugin state (divert) or real user content (render).
386
+ const m =
387
+ typeof window.cleanUserMessageForDisplay === "function"
388
+ ? window.cleanUserMessageForDisplay(rawM)
389
+ : rawM;
383
390
 
384
391
  // Route toolResult messages to the Reasoning Panel — they're tool output, not user-facing
385
392
  if (m.role === "toolResult" || m.role === "tool") {
@@ -544,10 +551,16 @@ async function loadMoreHistory() {
544
551
 
545
552
  // Build fragment of older messages (reuse same filtering as renderHistory)
546
553
  const frag = document.createDocumentFragment();
547
- for (const m of msgs) {
548
- if (!m || !m.role) {
554
+ for (const rawM of msgs) {
555
+ if (!rawM || !rawM.role) {
549
556
  continue;
550
557
  }
558
+ // 2.8.6: same cleanup as renderHistory — strip plugin banners + envelopes
559
+ // before filtering so pure-state pings divert, real content renders.
560
+ const m =
561
+ typeof window.cleanUserMessageForDisplay === "function"
562
+ ? window.cleanUserMessageForDisplay(rawM)
563
+ : rawM;
551
564
  if (m.role === "toolResult" || m.role === "tool") {
552
565
  const content = Array.isArray(m.content) ? m.content : [];
553
566
  const text = content
@@ -566,8 +579,15 @@ async function loadMoreHistory() {
566
579
  if (m.role === "system") {
567
580
  continue;
568
581
  }
569
- // Route symipulse messages to dedicated Symipulse Panel
570
- if (typeof window.isSymipulseMessage === "function" && window.isSymipulseMessage(m)) {
582
+ // Route symipulse messages to dedicated Symipulse Panel.
583
+ // 2.8.4 (backported to lazy-load in 2.8.6): user-role messages always
584
+ // render in the main feed — the symipulse classifier targets assistant
585
+ // noise, not user input.
586
+ if (
587
+ typeof window.isSymipulseMessage === "function" &&
588
+ m.role !== "user" &&
589
+ window.isSymipulseMessage(m)
590
+ ) {
571
591
  const txt = Array.isArray(m.content)
572
592
  ? m.content
573
593
  .filter((b) => b.type === "text")
@@ -581,7 +601,7 @@ async function loadMoreHistory() {
581
601
  continue;
582
602
  }
583
603
 
584
- // Route plugin context & verification user messages to Reasoning Panel
604
+ // Route verification user messages to Reasoning Panel
585
605
  if (m.role === "user") {
586
606
  const txt = Array.isArray(m.content)
587
607
  ? m.content
@@ -764,7 +764,65 @@ window.extractThinkingText = function (content) {
764
764
  };
765
765
 
766
766
  // ── Main render function — builds a full message element ──────────────
767
+ // 2.8.6: strip plugin banner + leading timestamp envelope from user message
768
+ // text before display. Plugins (e.g. Outlook) prepend their banner to every
769
+ // user turn via before_prompt_build/prependContext, and the auto-reply
770
+ // pipeline prepends a "[Wed 2026-04-22 01:21 CDT]" channel envelope — both
771
+ // end up baked into the persisted JSONL. They're useful to the model but
772
+ // pure noise in the UI. Stripping here fixes history reload without touching
773
+ // live-send path (which already has the user's clean typed text).
774
+ //
775
+ // Non-destructive: only touches strings that start with the specific banner
776
+ // or envelope patterns. User text that happens to open with "[something]"
777
+ // falls through unchanged unless the brackets contain a date-time or the
778
+ // literal "Connected as"/"Not connected" keywords.
779
+ const USER_PLUGIN_BANNER_RE = /^\[.+?\]\s+(Not connected|Connected as)\b[^\n]*\n?/i;
780
+ const USER_TIMESTAMP_ENVELOPE_RE = /^\[[^\]]*\b\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}\b[^\]]*\]\s*/;
781
+ window.cleanUserMessageText = function (text) {
782
+ if (typeof text !== "string" || !text) {
783
+ return text;
784
+ }
785
+ let cleaned = text.replace(USER_PLUGIN_BANNER_RE, "");
786
+ cleaned = cleaned.replace(/^\s+/, "");
787
+ cleaned = cleaned.replace(USER_TIMESTAMP_ENVELOPE_RE, "");
788
+ return cleaned;
789
+ };
790
+
791
+ // Returns a message with user-role text blocks cleaned of plugin banners and
792
+ // timestamp envelopes. Returns the original reference if nothing changed.
793
+ window.cleanUserMessageForDisplay = function (message) {
794
+ if (!message || message.role !== "user") {
795
+ return message;
796
+ }
797
+ if (typeof message.content === "string") {
798
+ const cleaned = window.cleanUserMessageText(message.content);
799
+ if (cleaned === message.content) {
800
+ return message;
801
+ }
802
+ return { ...message, content: cleaned };
803
+ }
804
+ if (!Array.isArray(message.content)) {
805
+ return message;
806
+ }
807
+ let changed = false;
808
+ const nextContent = message.content.map((block) => {
809
+ if (!block || block.type !== "text" || typeof block.text !== "string") {
810
+ return block;
811
+ }
812
+ const cleaned = window.cleanUserMessageText(block.text);
813
+ if (cleaned === block.text) {
814
+ return block;
815
+ }
816
+ changed = true;
817
+ return { ...block, text: cleaned };
818
+ });
819
+ return changed ? { ...message, content: nextContent } : message;
820
+ };
821
+
767
822
  window.renderMessage = function (message) {
823
+ // 2.8.6: clean plugin banner + timestamp envelope out of user messages first,
824
+ // so downstream filters and renderers see the user's actual content.
825
+ message = window.cleanUserMessageForDisplay(message);
768
826
  const { role, content, timestamp } = message;
769
827
  const isUser = role === "user";
770
828
 
@@ -5,7 +5,7 @@ import { c as getActivePluginRegistry, v as createInternalHookEvent, y as trigge
5
5
  import { t as createSubsystemLogger } from "./subsystem-CZixfwU8.js";
6
6
  import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-Cn6drXx2.js";
7
7
  import { r as normalizeChannelId, t as getChannelPlugin } from "./plugins-71oIavrF.js";
8
- import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-D8YgtMdl.js";
8
+ import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-BET359cH.js";
9
9
  import { d as getChannelDock } from "./thinking-W85Rb32m.js";
10
10
  import { c as resolveChunkMode, f as parseFenceSpans, i as chunkMarkdownTextWithMode, l as resolveTextChunkLimit, n as chunkByParagraph } from "./chunk-DTMTDXwE.js";
11
11
  import { n as resolveMarkdownTableMode } from "./markdown-tables-DawaaZEe.js";
@@ -3,7 +3,7 @@ import { s as resolveStateDir } from "./paths-CE7eVGHg.js";
3
3
  import { m as normalizeOptionalAccountId, p as normalizeAccountId } from "./session-key-BCzIW1Y2.js";
4
4
  import { c as getActivePluginRegistry, v as createInternalHookEvent, x as triggerInternalHook } from "./registry-DYq1AYOv.js";
5
5
  import { t as createSubsystemLogger } from "./subsystem-BjyjJF-d.js";
6
- import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-BUNbSNWw.js";
6
+ import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-DcN8GHTt.js";
7
7
  import { d as getChannelDock } from "./thinking-BprCy23Z.js";
8
8
  import { r as normalizeChannelId, t as getChannelPlugin } from "./plugins-BzmbgY7s.js";
9
9
  import { a as isSilentReplyText, n as SILENT_REPLY_TOKEN } from "./tokens-W0JzCJJM.js";
@@ -7,13 +7,13 @@ import { a as resolveAgentIdentity } from "./reply-prefix-K_J_nfgx.js";
7
7
  import "./github-copilot-token-BbsJ0Qbo.js";
8
8
  import "./env-CQ_DQOwT.js";
9
9
  import "./tokens-Cn6drXx2.js";
10
- import { D as resolveAgentTimeoutMs, p as runEmbeddedPiAgent } from "./pi-embedded-BIATvD3R.js";
10
+ import { D as resolveAgentTimeoutMs, p as runEmbeddedPiAgent } from "./pi-embedded-BaNpG0Aq.js";
11
11
  import "./plugins-71oIavrF.js";
12
12
  import "./accounts-DDEyGwby.js";
13
13
  import "./bindings-DYVakimr.js";
14
14
  import "./send-BuJyyJe7.js";
15
15
  import "./send-D8AIYNR_.js";
16
- import "./deliver-DrC7tG6s.js";
16
+ import "./deliver-B36OzmeP.js";
17
17
  import "./diagnostic-D0xmLpej.js";
18
18
  import "./diagnostic-session-state-C1vRJs5w.js";
19
19
  import "./accounts-8zZqL37v.js";
@@ -21,10 +21,10 @@ import "./send-C0K_2AUP.js";
21
21
  import "./image-ops-ByaQt43P.js";
22
22
  import "./pi-model-discovery-j5tVLINv.js";
23
23
  import "./message-channel-BQINJQIT.js";
24
- import { G as saveSessionStore, H as loadSessionStore } from "./pi-embedded-helpers-D8YgtMdl.js";
24
+ import { G as saveSessionStore, H as loadSessionStore } from "./pi-embedded-helpers-BET359cH.js";
25
25
  import "./config-BAVNLbja.js";
26
26
  import "./manifest-registry-DWdYdchb.js";
27
- import "./chrome-B14NNyfm.js";
27
+ import "./chrome-BUT--ob3.js";
28
28
  import "./skills-XEbTRNYL.js";
29
29
  import "./redact-1NGYV_8p.js";
30
30
  import "./errors-CPfngF0S.js";
@@ -34,7 +34,7 @@ import "./thinking-W85Rb32m.js";
34
34
  import "./accounts-DImOt9jX.js";
35
35
  import { n as resolveSessionFilePath, s as resolveStorePath } from "./paths-DkMamAQ-.js";
36
36
  import "./tool-images-ChC2CXaN.js";
37
- import "./image-CKeN0xJL.js";
37
+ import "./image-BHhzdmbq.js";
38
38
  import "./manager-B0BFUVEs.js";
39
39
  import "./gemini-auth-DVcG-42i.js";
40
40
  import "./sqlite-BNh23mUR.js";
@@ -47,7 +47,7 @@ import "./ir-F0moAwIl.js";
47
47
  import "./render-B1VqYyvo.js";
48
48
  import "./commands-registry-D9ZzWaEz.js";
49
49
  import "./skill-commands-CkqZdod4.js";
50
- import "./runner-COpebDew.js";
50
+ import "./runner-BVgCl6yZ.js";
51
51
  import "./fetch-DtLn7YU3.js";
52
52
  import "./channel-activity-D9q-fIPB.js";
53
53
  import "./tables-COnZ169v.js";
@@ -2,7 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { D as isRecord, I as shortenHomeInString } from "./registry-BhoUuugi.js";
3
3
  import { G as resolveSymiAgentDir, S as getApiKeyForModel, X as normalizeSecretInput, _ as resolveImplicitBedrockProvider, g as normalizeProviders, v as resolveImplicitCopilotProvider, w as requireApiKey, y as resolveImplicitProviders } from "./model-selection-vHAQ4r1b.js";
4
4
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-j5tVLINv.js";
5
- import { N as sanitizeUserFacingText } from "./pi-embedded-helpers-D8YgtMdl.js";
5
+ import { N as sanitizeUserFacingText } from "./pi-embedded-helpers-BET359cH.js";
6
6
  import { n as loadConfig } from "./config-BAVNLbja.js";
7
7
  import { n as redactToolDetail } from "./redact-1NGYV_8p.js";
8
8
  import path from "node:path";
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
2
  import { R as shortenHomeInString, k as isRecord } from "./registry-DYq1AYOv.js";
3
3
  import { L as getApiKeyForModel, M as resolveImplicitBedrockProvider, N as resolveImplicitCopilotProvider, P as resolveImplicitProviders, W as normalizeSecretInput, et as resolveSymiAgentDir, j as normalizeProviders, z as requireApiKey } from "./auth-profiles-C2vj6htZ.js";
4
- import { N as sanitizeUserFacingText } from "./pi-embedded-helpers-BUNbSNWw.js";
4
+ import { N as sanitizeUserFacingText } from "./pi-embedded-helpers-DcN8GHTt.js";
5
5
  import { n as loadConfig } from "./config-BkZ9HOKT.js";
6
6
  import { n as redactToolDetail } from "./redact-BDMXB06K.js";
7
7
  import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-CuZX_Q4t.js";
@@ -3,16 +3,16 @@ import "./registry-DYq1AYOv.js";
3
3
  import { c as resolveDefaultAgentId, s as resolveAgentWorkspaceDir } from "./agent-scope-CpEJ0B88.js";
4
4
  import "./subsystem-BjyjJF-d.js";
5
5
  import "./workspace-DscDraUb.js";
6
- import { t as runAgentTurn } from "./unified-runner-CUXcv08a.js";
6
+ import { t as runAgentTurn } from "./unified-runner-BojeuKIk.js";
7
7
  import "./paths-CbQV9WEg.js";
8
8
  import "./auth-profiles-C2vj6htZ.js";
9
9
  import "./env-BDXYbTKj.js";
10
10
  import "./github-copilot-token-cCYzSU9h.js";
11
11
  import "./boolean-CE7i9tBR.js";
12
- import "./pi-embedded-helpers-BUNbSNWw.js";
12
+ import "./pi-embedded-helpers-DcN8GHTt.js";
13
13
  import "./config-BkZ9HOKT.js";
14
14
  import "./manifest-registry-CBCGTsIb.js";
15
- import "./chrome-ROtrXlNs.js";
15
+ import "./chrome-C08Z0XAa.js";
16
16
  import "./frontmatter-CTR5f_Ez.js";
17
17
  import "./skills-CXxrn_e2.js";
18
18
  import "./redact-BDMXB06K.js";
@@ -30,10 +30,10 @@ import "./bindings-BsHoBLIE.js";
30
30
  import "./send-B7aHpAco.js";
31
31
  import "./send-Yzy50T1h.js";
32
32
  import "./tool-images-SqqWIT22.js";
33
- import "./deliver-BC3liFsT.js";
33
+ import "./deliver-CLZGlRZt.js";
34
34
  import "./diagnostic-CQiU0O8b.js";
35
35
  import "./diagnostic-session-state-Zw87xFym.js";
36
- import "./image-C6v6m8Id.js";
36
+ import "./image-BnO8X_hj.js";
37
37
  import "./pi-auth-json-RXOlh8ar.js";
38
38
  import "./tokens-W0JzCJJM.js";
39
39
  import "./send-xTfsDEE2.js";
@@ -50,7 +50,7 @@ import "./local-roots-Se92wAN5.js";
50
50
  import "./ir-JAy_3A3B.js";
51
51
  import "./render-DwEu-aCr.js";
52
52
  import "./commands-registry-CfoYlMQB.js";
53
- import "./runner-QX0Z6K1w.js";
53
+ import "./runner-D5nFF9E6.js";
54
54
  import "./skill-commands-D1hG6Ikz.js";
55
55
  import "./fetch-Dnti0cFs.js";
56
56
  import "./channel-activity-D-kw83R0.js";