@symerian/symi 2.7.3 → 2.7.5

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-K-s65jbB.js → audio-preflight-COaFw917.js} +4 -4
  2. package/dist/{audio-preflight-HILy3i0m.js → audio-preflight-DD18zIZd.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-CiOKaTN-.js → chrome-BxwUEWrH.js} +7 -7
  8. package/dist/{chrome-BYOhnxTr.js → chrome-CbA-qnhp.js} +7 -7
  9. package/dist/control-ui/css/style.css +0 -94
  10. package/dist/control-ui/js/history.js +33 -48
  11. package/dist/{deliver-C1HRkzPJ.js → deliver-C7NePF9Z.js} +1 -1
  12. package/dist/{deliver-D6IcPfbt.js → deliver-DtuY4Wgl.js} +1 -1
  13. package/dist/extensionAPI.js +6 -6
  14. package/dist/{image-CbyTdMd5.js → image-C3ugMkb5.js} +1 -1
  15. package/dist/{image-D7Fl08gG.js → image-lp19FlzF.js} +1 -1
  16. package/dist/llm-slug-generator.js +6 -6
  17. package/dist/{pi-embedded-BzS693I1.js → pi-embedded-Ckr9dJ_g.js} +16 -16
  18. package/dist/{pi-embedded-helpers-GaCyI2oH.js → pi-embedded-helpers-BgRcgoC9.js} +4 -4
  19. package/dist/{pi-embedded-helpers-DXAoe1Bx.js → pi-embedded-helpers-Dij3O6ox.js} +4 -4
  20. package/dist/{pw-ai-pQoxTh-a.js → pw-ai--LDjnyuN.js} +1 -1
  21. package/dist/{pw-ai-CANiWpMA.js → pw-ai-BO5cSmwD.js} +1 -1
  22. package/dist/{runner-BS9gGL5i.js → runner-Ct0suQrd.js} +1 -1
  23. package/dist/{runner-B0AbN8wV.js → runner-cJ3m-bxK.js} +1 -1
  24. package/dist/{unified-runner-d5RKhmX1.js → unified-runner-CApgXtVC.js} +16 -16
  25. package/dist/{web-Db_-ahjX.js → web-C_jJEyUH.js} +6 -6
  26. package/dist/{web-D8KjxNeZ.js → web-CthDLVSz.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 +12 -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 +12 -0
  47. package/extensions/msteams/package.json +1 -1
  48. package/extensions/nextcloud-talk/package.json +1 -1
  49. package/extensions/nostr/CHANGELOG.md +12 -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 +12 -0
  59. package/extensions/twitch/package.json +1 -1
  60. package/extensions/voice-call/CHANGELOG.md +12 -0
  61. package/extensions/voice-call/package.json +1 -1
  62. package/extensions/whatsapp/package.json +1 -1
  63. package/extensions/zalo/CHANGELOG.md +12 -0
  64. package/extensions/zalo/package.json +1 -1
  65. package/extensions/zalouser/CHANGELOG.md +12 -0
  66. package/extensions/zalouser/package.json +1 -1
  67. package/package.json +1 -1
@@ -8,10 +8,10 @@ import "./auth-profiles-q3HjbboY.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-GaCyI2oH.js";
11
+ import "./pi-embedded-helpers-BgRcgoC9.js";
12
12
  import "./config-B6OxYMgn.js";
13
13
  import "./manifest-registry-yb7sAlu4.js";
14
- import "./chrome-BYOhnxTr.js";
14
+ import "./chrome-CbA-qnhp.js";
15
15
  import "./frontmatter-CTR5f_Ez.js";
16
16
  import "./skills-Bs0AW1g3.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-CbyTdMd5.js";
30
+ import "./image-C3ugMkb5.js";
31
31
  import "./pi-model-discovery-CuZX_Q4t.js";
32
32
  import "./gemini-auth-BkLFtndu.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-B0AbN8wV.js";
34
+ import { a as resolveMediaAttachmentLocalRoots, n as createMediaAttachmentCache, o as runCapability, r as normalizeMediaAttachments, t as buildProviderRegistry, u as isAudioAttachment } from "./runner-cJ3m-bxK.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-DXAoe1Bx.js";
15
+ import "./pi-embedded-helpers-Dij3O6ox.js";
16
16
  import "./config-BUTI-mUZ.js";
17
17
  import "./manifest-registry-D-mTF1cj.js";
18
- import "./chrome-CiOKaTN-.js";
18
+ import "./chrome-BxwUEWrH.js";
19
19
  import "./skills-BNpGMnp-.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-D7Fl08gG.js";
28
+ import "./image-lp19FlzF.js";
29
29
  import "./gemini-auth-ClVyOv9p.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-BS9gGL5i.js";
31
+ import { a as resolveMediaAttachmentLocalRoots, n as createMediaAttachmentCache, o as runCapability, r as normalizeMediaAttachments, t as buildProviderRegistry, u as isAudioAttachment } from "./runner-Ct0suQrd.js";
32
32
 
33
33
  //#region src/media-understanding/audio-preflight.ts
34
34
  /**
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.7.3",
3
- "commit": "f5f40be5fc915ea3a2dd5842944256c8c3e9f5cb",
4
- "builtAt": "2026-04-20T22:37:01.661Z"
2
+ "version": "2.7.5",
3
+ "commit": "6dcb172940f9b976f2c3407c13e837389a4990f5",
4
+ "builtAt": "2026-04-20T22:46:58.415Z"
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-d5RKhmX1.js";
7
+ import { a as createDefaultDeps, i as agentCommand } from "../../unified-runner-CApgXtVC.js";
8
8
  import { s as resolveStorePath } from "../../paths-CbQV9WEg.js";
9
9
  import "../../auth-profiles-q3HjbboY.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-GaCyI2oH.js";
13
+ import { H as loadSessionStore, K as updateSessionStore, xt as resolveMainSessionKey, yt as resolveAgentMainSessionKey } from "../../pi-embedded-helpers-BgRcgoC9.js";
14
14
  import "../../config-B6OxYMgn.js";
15
15
  import "../../manifest-registry-yb7sAlu4.js";
16
- import "../../chrome-BYOhnxTr.js";
16
+ import "../../chrome-CbA-qnhp.js";
17
17
  import "../../frontmatter-CTR5f_Ez.js";
18
18
  import "../../skills-Bs0AW1g3.js";
19
19
  import "../../redact-BDMXB06K.js";
@@ -31,10 +31,10 @@ import "../../bindings-BsHoBLIE.js";
31
31
  import "../../send-DI9Vhnmw.js";
32
32
  import "../../send-BNnv8GtF.js";
33
33
  import "../../tool-images-SqqWIT22.js";
34
- import "../../deliver-C1HRkzPJ.js";
34
+ import "../../deliver-C7NePF9Z.js";
35
35
  import "../../diagnostic-CQiU0O8b.js";
36
36
  import "../../diagnostic-session-state-Zw87xFym.js";
37
- import "../../image-CbyTdMd5.js";
37
+ import "../../image-C3ugMkb5.js";
38
38
  import "../../pi-auth-json-CCaxCywz.js";
39
39
  import { n as SILENT_REPLY_TOKEN } from "../../tokens-W0JzCJJM.js";
40
40
  import "../../send-DaBsat3L.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-BSvi46KZ.js";
54
- import "../../runner-B0AbN8wV.js";
54
+ import "../../runner-cJ3m-bxK.js";
55
55
  import "../../skill-commands-BiPrghRt.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-d5RKhmX1.js";
7
+ import "../../unified-runner-CApgXtVC.js";
8
8
  import "../../paths-CbQV9WEg.js";
9
9
  import "../../auth-profiles-q3HjbboY.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-GaCyI2oH.js";
13
+ import { ct as hasInterSessionUserProvenance } from "../../pi-embedded-helpers-BgRcgoC9.js";
14
14
  import "../../config-B6OxYMgn.js";
15
15
  import "../../manifest-registry-yb7sAlu4.js";
16
- import "../../chrome-BYOhnxTr.js";
16
+ import "../../chrome-CbA-qnhp.js";
17
17
  import "../../frontmatter-CTR5f_Ez.js";
18
18
  import "../../skills-Bs0AW1g3.js";
19
19
  import "../../redact-BDMXB06K.js";
@@ -31,10 +31,10 @@ import "../../bindings-BsHoBLIE.js";
31
31
  import "../../send-DI9Vhnmw.js";
32
32
  import "../../send-BNnv8GtF.js";
33
33
  import "../../tool-images-SqqWIT22.js";
34
- import "../../deliver-C1HRkzPJ.js";
34
+ import "../../deliver-C7NePF9Z.js";
35
35
  import "../../diagnostic-CQiU0O8b.js";
36
36
  import "../../diagnostic-session-state-Zw87xFym.js";
37
- import "../../image-CbyTdMd5.js";
37
+ import "../../image-C3ugMkb5.js";
38
38
  import "../../pi-auth-json-CCaxCywz.js";
39
39
  import "../../tokens-W0JzCJJM.js";
40
40
  import "../../send-DaBsat3L.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-BSvi46KZ.js";
54
- import "../../runner-B0AbN8wV.js";
54
+ import "../../runner-cJ3m-bxK.js";
55
55
  import "../../skill-commands-BiPrghRt.js";
56
56
  import "../../fetch-Dnti0cFs.js";
57
57
  import "../../channel-activity-D-kw83R0.js";
@@ -1 +1 @@
1
- 38b0ac6fb30dabf68bed308bd5ce1904953ba14546b7f1db1cafe7423ce838e8
1
+ 1c8cc415c6f6b398d23552856205e0dd0ac89ed82b3a7162ec68f8a360ee7d05
@@ -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$1, { WebSocketServer } from "ws";
13
+ import WebSocket, { 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$1.OPEN) throw new Error("Chrome extension not connected");
181
+ if (!ws || ws.readyState !== WebSocket.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$1.OPEN) continue;
198
+ if (ws.readyState !== WebSocket.OPEN) continue;
199
199
  ws.send(msg);
200
200
  }
201
201
  };
202
202
  const sendResponseToCdp = (ws, res) => {
203
- if (ws.readyState !== WebSocket$1.OPEN) return;
203
+ if (ws.readyState !== WebSocket.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$1.OPEN) return;
428
+ if (ws.readyState !== WebSocket.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$1(wsUrl, {
746
+ const ws = new WebSocket(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$1(wsUrl, {
1640
+ const ws = new WebSocket(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$1, { WebSocketServer } from "ws";
13
+ import WebSocket, { 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$1.OPEN) throw new Error("Chrome extension not connected");
181
+ if (!ws || ws.readyState !== WebSocket.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$1.OPEN) continue;
198
+ if (ws.readyState !== WebSocket.OPEN) continue;
199
199
  ws.send(msg);
200
200
  }
201
201
  };
202
202
  const sendResponseToCdp = (ws, res) => {
203
- if (ws.readyState !== WebSocket$1.OPEN) return;
203
+ if (ws.readyState !== WebSocket.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$1.OPEN) return;
428
+ if (ws.readyState !== WebSocket.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$1(wsUrl, {
746
+ const ws = new WebSocket(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$1(wsUrl, {
1640
+ const ws = new WebSocket(wsUrl, {
1641
1641
  handshakeTimeout: timeoutMs,
1642
1642
  ...Object.keys(headers).length ? { headers } : {}
1643
1643
  });
@@ -5489,97 +5489,3 @@ body {
5489
5489
  }
5490
5490
  }
5491
5491
 
5492
- /* Informational footer for the CURRENT row (replaces action buttons). */
5493
- .history-session-current-note {
5494
- margin-top: 8px;
5495
- padding: 6px 10px;
5496
- font-family: var(--font-mono);
5497
- font-size: 10px;
5498
- letter-spacing: 0.05em;
5499
- color: rgba(16, 185, 129, 0.75);
5500
- background: rgba(16, 185, 129, 0.05);
5501
- border: 1px dashed rgba(16, 185, 129, 0.2);
5502
- border-radius: 4px;
5503
- text-align: center;
5504
- }
5505
-
5506
- /* "↺ Return to previous session" banner — top of drawer, one-click undo
5507
- of the last Load action when a recent .reset.* archive exists. */
5508
- .history-return-banner {
5509
- display: flex;
5510
- align-items: center;
5511
- justify-content: space-between;
5512
- gap: 12px;
5513
- margin: 10px 12px;
5514
- padding: 12px 14px;
5515
- background: linear-gradient(
5516
- 135deg,
5517
- rgba(0, 212, 255, 0.08) 0%,
5518
- rgba(139, 92, 246, 0.08) 100%
5519
- );
5520
- border: 1px solid rgba(0, 212, 255, 0.25);
5521
- border-radius: 8px;
5522
- }
5523
-
5524
- .history-return-label {
5525
- display: flex;
5526
- align-items: center;
5527
- gap: 10px;
5528
- flex: 1;
5529
- min-width: 0;
5530
- }
5531
-
5532
- .history-return-arrow {
5533
- font-size: 20px;
5534
- color: var(--accent-cyan);
5535
- line-height: 1;
5536
- }
5537
-
5538
- .history-return-text {
5539
- flex: 1;
5540
- min-width: 0;
5541
- }
5542
-
5543
- .history-return-title {
5544
- font-family: var(--font-mono);
5545
- font-size: 11px;
5546
- font-weight: 700;
5547
- letter-spacing: 0.08em;
5548
- color: rgba(255, 255, 255, 0.95);
5549
- text-transform: uppercase;
5550
- }
5551
-
5552
- .history-return-preview {
5553
- font-size: 11px;
5554
- color: rgba(255, 255, 255, 0.5);
5555
- margin-top: 2px;
5556
- white-space: nowrap;
5557
- overflow: hidden;
5558
- text-overflow: ellipsis;
5559
- }
5560
-
5561
- .history-return-btn {
5562
- padding: 6px 14px;
5563
- height: 30px;
5564
- background: rgba(0, 212, 255, 0.15);
5565
- border: 1px solid rgba(0, 212, 255, 0.35);
5566
- border-radius: 6px;
5567
- color: rgba(0, 212, 255, 1);
5568
- font-family: var(--font-mono);
5569
- font-size: 10px;
5570
- font-weight: 700;
5571
- letter-spacing: 0.08em;
5572
- cursor: pointer;
5573
- transition: all 0.15s;
5574
- flex-shrink: 0;
5575
- }
5576
-
5577
- .history-return-btn:hover {
5578
- background: rgba(0, 212, 255, 0.25);
5579
- border-color: rgba(0, 212, 255, 0.55);
5580
- }
5581
-
5582
- .history-return-btn:disabled {
5583
- opacity: 0.6;
5584
- cursor: wait;
5585
- }
@@ -75,25 +75,21 @@
75
75
  const favourites = sessions.filter((s) => s.kind !== "current" && s.favorited);
76
76
  const recent = sessions.filter((s) => s.kind !== "current" && !s.favorited);
77
77
 
78
- // "Return to previous session" candidate: the newest .reset.* archive
79
- // with real content, archived within the last 24h. Surfaces a
80
- // one-click undo for the most common "I just loaded a past session
81
- // and want to go back" flow.
78
+ // Newest `.reset.*` archive with content — this becomes the target of
79
+ // the Load Session button on the CURRENT row, giving the user a
80
+ // one-click path back to the session they just left.
82
81
  const returnCandidate = findReturnCandidate(sessions);
83
82
 
84
83
  drawerBody.innerHTML = "";
85
84
 
86
- if (returnCandidate) {
87
- drawerBody.appendChild(renderReturnBanner(returnCandidate));
88
- }
89
85
  if (current.length > 0) {
90
- drawerBody.appendChild(renderSection("CURRENT", current));
86
+ drawerBody.appendChild(renderSection("CURRENT", current, returnCandidate));
91
87
  }
92
88
  if (favourites.length > 0) {
93
- drawerBody.appendChild(renderSection("★ FAVOURITES", favourites));
89
+ drawerBody.appendChild(renderSection("★ FAVOURITES", favourites, null));
94
90
  }
95
91
  if (recent.length > 0) {
96
- drawerBody.appendChild(renderSection("RECENT", recent));
92
+ drawerBody.appendChild(renderSection("RECENT", recent, null));
97
93
  }
98
94
  }
99
95
 
@@ -127,33 +123,7 @@
127
123
  return candidates[0];
128
124
  }
129
125
 
130
- function renderReturnBanner(row) {
131
- const banner = document.createElement("div");
132
- banner.className = "history-return-banner";
133
- const when = formatTimestamp(row.archivedAt ?? row.lastActivity);
134
- const preview = row.preview
135
- ? escHtml(row.preview).slice(0, 60) + (row.preview.length > 60 ? "…" : "")
136
- : "(no messages)";
137
- banner.innerHTML = `
138
- <div class="history-return-label">
139
- <span class="history-return-arrow">↺</span>
140
- <div class="history-return-text">
141
- <div class="history-return-title">Return to previous session</div>
142
- <div class="history-return-preview">${preview} · ${escHtml(when)}</div>
143
- </div>
144
- </div>
145
- <button class="history-return-btn" type="button">Load</button>
146
- `;
147
- const btn = banner.querySelector(".history-return-btn");
148
- btn.addEventListener("click", async () => {
149
- btn.disabled = true;
150
- btn.textContent = "Loading…";
151
- await loadRow(row);
152
- });
153
- return banner;
154
- }
155
-
156
- function renderSection(title, rows) {
126
+ function renderSection(title, rows, returnCandidate) {
157
127
  const section = document.createElement("section");
158
128
  section.className = "history-section";
159
129
  const heading = document.createElement("div");
@@ -161,12 +131,15 @@
161
131
  heading.textContent = title;
162
132
  section.appendChild(heading);
163
133
  for (const row of rows) {
164
- section.appendChild(renderRow(row));
134
+ // Pass the return candidate through only for the CURRENT row — it
135
+ // drives the row's Load Session button (which returns the user to
136
+ // their previous session). Other rows use their own row data.
137
+ section.appendChild(renderRow(row, row.kind === "current" ? returnCandidate : null));
165
138
  }
166
139
  return section;
167
140
  }
168
141
 
169
- function renderRow(row) {
142
+ function renderRow(row, returnCandidate) {
170
143
  const item = document.createElement("div");
171
144
  item.className = "history-session-item history-session-" + row.kind;
172
145
 
@@ -176,14 +149,21 @@
176
149
  ? escHtml(row.preview) + (row.preview.length >= 80 ? "…" : "")
177
150
  : '<em style="opacity:0.5">No messages</em>';
178
151
 
179
- // Current-session footer is informational no buttons needed.
180
- const footerHtml =
181
- row.kind === "current"
182
- ? `<div class="history-session-current-note">◉ You're chatting in this session right now</div>`
183
- : `<footer class="history-session-actions">
184
- ${row.canLoad ? `<button class="history-load-btn">Load Session</button>` : ""}
185
- ${row.canDelete ? `<button class="history-delete-btn">Delete</button>` : ""}
186
- </footer>`;
152
+ // CURRENT row's Load Session button targets the most-recent .reset.*
153
+ // archive (returnCandidate). Non-current rows use their own file.
154
+ let footerHtml;
155
+ if (row.kind === "current") {
156
+ footerHtml = returnCandidate
157
+ ? `<footer class="history-session-actions">
158
+ <button class="history-load-btn" data-return="1">Load Session</button>
159
+ </footer>`
160
+ : "";
161
+ } else {
162
+ footerHtml = `<footer class="history-session-actions">
163
+ ${row.canLoad ? `<button class="history-load-btn">Load Session</button>` : ""}
164
+ ${row.canDelete ? `<button class="history-delete-btn">Delete</button>` : ""}
165
+ </footer>`;
166
+ }
187
167
 
188
168
  item.innerHTML = `
189
169
  <header class="history-session-header">
@@ -226,7 +206,12 @@
226
206
  const loadBtn = item.querySelector(".history-load-btn");
227
207
  loadBtn?.addEventListener("click", async (e) => {
228
208
  e.stopPropagation();
229
- await loadRow(row);
209
+ // On the CURRENT row, Load Session loads the most-recent archive
210
+ // (returnCandidate). On PAST/ARCHIVED rows, it loads that row.
211
+ const target = loadBtn.getAttribute("data-return") === "1" ? returnCandidate : row;
212
+ if (target) {
213
+ await loadRow(target);
214
+ }
230
215
  });
231
216
 
232
217
  const deleteBtn = item.querySelector(".history-delete-btn");
@@ -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-GaCyI2oH.js";
6
+ import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-BgRcgoC9.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";
@@ -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-DXAoe1Bx.js";
8
+ import { B as resolveMirroredTranscriptText, i as isMessagingToolDuplicate, z as appendAssistantMessageToSessionTranscript } from "./pi-embedded-helpers-Dij3O6ox.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";
@@ -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-BzS693I1.js";
10
+ import { D as resolveAgentTimeoutMs, p as runEmbeddedPiAgent } from "./pi-embedded-Ckr9dJ_g.js";
11
11
  import "./plugins-71oIavrF.js";
12
12
  import "./accounts-DDEyGwby.js";
13
13
  import "./bindings-DYVakimr.js";
14
14
  import "./send-BzKHnf3b.js";
15
15
  import "./send-RfIXG6-I.js";
16
- import "./deliver-D6IcPfbt.js";
16
+ import "./deliver-DtuY4Wgl.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-B986asZ7.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-DXAoe1Bx.js";
24
+ import { G as saveSessionStore, H as loadSessionStore } from "./pi-embedded-helpers-Dij3O6ox.js";
25
25
  import "./config-BUTI-mUZ.js";
26
26
  import "./manifest-registry-D-mTF1cj.js";
27
- import "./chrome-CiOKaTN-.js";
27
+ import "./chrome-BxwUEWrH.js";
28
28
  import "./skills-BNpGMnp-.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-D7Fl08gG.js";
37
+ import "./image-lp19FlzF.js";
38
38
  import "./manager-CgLdpXXM.js";
39
39
  import "./gemini-auth-ClVyOv9p.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-DYoNKo_h.js";
49
49
  import "./skill-commands-D8RiKDh0.js";
50
- import "./runner-BS9gGL5i.js";
50
+ import "./runner-Ct0suQrd.js";
51
51
  import "./fetch-DtLn7YU3.js";
52
52
  import "./channel-activity-D9q-fIPB.js";
53
53
  import "./tables-COnZ169v.js";
@@ -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-q3HjbboY.js";
4
- import { N as sanitizeUserFacingText } from "./pi-embedded-helpers-GaCyI2oH.js";
4
+ import { N as sanitizeUserFacingText } from "./pi-embedded-helpers-BgRcgoC9.js";
5
5
  import { n as loadConfig } from "./config-B6OxYMgn.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";
@@ -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-B8QKPmTL.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-DXAoe1Bx.js";
5
+ import { N as sanitizeUserFacingText } from "./pi-embedded-helpers-Dij3O6ox.js";
6
6
  import { n as loadConfig } from "./config-BUTI-mUZ.js";
7
7
  import { n as redactToolDetail } from "./redact-1NGYV_8p.js";
8
8
  import path from "node:path";
@@ -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-d5RKhmX1.js";
6
+ import { t as runAgentTurn } from "./unified-runner-CApgXtVC.js";
7
7
  import "./paths-CbQV9WEg.js";
8
8
  import "./auth-profiles-q3HjbboY.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-GaCyI2oH.js";
12
+ import "./pi-embedded-helpers-BgRcgoC9.js";
13
13
  import "./config-B6OxYMgn.js";
14
14
  import "./manifest-registry-yb7sAlu4.js";
15
- import "./chrome-BYOhnxTr.js";
15
+ import "./chrome-CbA-qnhp.js";
16
16
  import "./frontmatter-CTR5f_Ez.js";
17
17
  import "./skills-Bs0AW1g3.js";
18
18
  import "./redact-BDMXB06K.js";
@@ -30,10 +30,10 @@ import "./bindings-BsHoBLIE.js";
30
30
  import "./send-DI9Vhnmw.js";
31
31
  import "./send-BNnv8GtF.js";
32
32
  import "./tool-images-SqqWIT22.js";
33
- import "./deliver-C1HRkzPJ.js";
33
+ import "./deliver-C7NePF9Z.js";
34
34
  import "./diagnostic-CQiU0O8b.js";
35
35
  import "./diagnostic-session-state-Zw87xFym.js";
36
- import "./image-CbyTdMd5.js";
36
+ import "./image-C3ugMkb5.js";
37
37
  import "./pi-auth-json-CCaxCywz.js";
38
38
  import "./tokens-W0JzCJJM.js";
39
39
  import "./send-DaBsat3L.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-BSvi46KZ.js";
53
- import "./runner-B0AbN8wV.js";
53
+ import "./runner-cJ3m-bxK.js";
54
54
  import "./skill-commands-BiPrghRt.js";
55
55
  import "./fetch-Dnti0cFs.js";
56
56
  import "./channel-activity-D-kw83R0.js";