@symerian/symi 3.5.32 → 3.5.34

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 (113) hide show
  1. package/dist/{agent-BsRYHa15.js → agent-DkwJ_C7T.js} +1 -1
  2. package/dist/{agent-TRt_SsAW.js → agent-Dyqpglpp.js} +1 -1
  3. package/dist/{agents-7qMp2MWu.js → agents-CuwUmffQ.js} +2 -2
  4. package/dist/{auth-choice-DcB72YWZ.js → auth-choice-CbNJI71b.js} +1 -1
  5. package/dist/{auth-choice-C8lwYiEQ.js → auth-choice-Di2NnC96.js} +1 -1
  6. package/dist/{banner-B5Hv4rlk.js → banner-F6EJmEcS.js} +1 -1
  7. package/dist/build-info.json +3 -3
  8. package/dist/bundled/boot-md/handler.js +2 -2
  9. package/dist/bundled/session-memory/handler.js +2 -2
  10. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  11. package/dist/{channel-options-DOzFci6h.js → channel-options-CLEZcALj.js} +1 -1
  12. package/dist/{channel-options-ZkruGuHl.js → channel-options-IVQWWWuc.js} +1 -1
  13. package/dist/{channels-cli-CEz9LILV.js → channels-cli-Bl17If5e.js} +7 -7
  14. package/dist/{channels-cli-DMShhX0d.js → channels-cli-D8d9ok3b.js} +7 -7
  15. package/dist/{chrome-DNssqQJs.js → chrome-3jl2ulOE.js} +7 -7
  16. package/dist/{cli-MDHkESMC.js → cli-BIoLyk88.js} +4 -4
  17. package/dist/{cli-Byovb_j5.js → cli-CbAnYkYs.js} +4 -4
  18. package/dist/{command-registry-Dzj-Uz5N.js → command-registry-C5LOUwKq.js} +10 -10
  19. package/dist/{completion-cli-vAwL_uEK.js → completion-cli-Dcc5-bYY.js} +2 -2
  20. package/dist/{completion-cli-CsJ2f_fk.js → completion-cli-DewJuifK.js} +1 -1
  21. package/dist/{config-cli-cmea_Z-A.js → config-cli-CMsbPGB3.js} +1 -1
  22. package/dist/{config-cli-CqqCDyf0.js → config-cli-DemkhbXj.js} +1 -1
  23. package/dist/{configure-DymrZd1n.js → configure-CW75YbiI.js} +2 -2
  24. package/dist/{configure-BEPKQuJj.js → configure-Dc5xcSyf.js} +2 -2
  25. package/dist/control-ui/css/style.css +162 -0
  26. package/dist/control-ui/js/symframe.js +135 -0
  27. package/dist/{deliver-q23ar_Pm.js → deliver-f3cIWxXT.js} +4 -4
  28. package/dist/{doctor-completion--phnyAqO.js → doctor-completion-BpVYwGK0.js} +1 -1
  29. package/dist/{doctor-completion-BY72G6-l.js → doctor-completion-DQmw1ojx.js} +1 -1
  30. package/dist/entry.js +1 -1
  31. package/dist/extensionAPI.js +4 -4
  32. package/dist/{gateway-cli-Bo80TSkq.js → gateway-cli-Dx6ulSWd.js} +10 -10
  33. package/dist/{gateway-cli-BVpyqk_H.js → gateway-cli-TdnIAl4W.js} +10 -10
  34. package/dist/{glass-ui-ws-CrmnRYxe.js → glass-ui-ws-BF5GGXNz.js} +8 -8
  35. package/dist/{glass-ui-ws-BK5qk7-_.js → glass-ui-ws-CZkskC04.js} +8 -8
  36. package/dist/{hooks-cli-CjklMDuK.js → hooks-cli-DFMpZI4k.js} +5 -5
  37. package/dist/{hooks-cli-CqmTdxT6.js → hooks-cli-Djw7WFoS.js} +5 -5
  38. package/dist/index.js +8 -8
  39. package/dist/llm-slug-generator.js +2 -2
  40. package/dist/{manager-DM2oPS8M.js → manager-BVgukgOu.js} +1 -1
  41. package/dist/{manager-NDn8AFhr.js → manager-CAdF4u2G.js} +1 -1
  42. package/dist/{manager-XfNxjaX5.js → manager-DSXvXUZQ.js} +1 -1
  43. package/dist/{manager-CL767Sv9.js → manager-Dw6j9KTZ.js} +1 -1
  44. package/dist/{memory-CTf9MdBg.js → memory-7DZfwFEz.js} +2 -2
  45. package/dist/{memory-DOl2l2AS.js → memory-CuBkKhKM.js} +2 -2
  46. package/dist/{memory-cli-B9_Vfaow.js → memory-cli-C8h9g8yO.js} +2 -2
  47. package/dist/{memory-cli-CA5PbH9y.js → memory-cli-CGqqpDlw.js} +2 -2
  48. package/dist/{models-DgiBOeVH.js → models-CLJSIS8A.js} +2 -2
  49. package/dist/{models-cli-B7gTrlgn.js → models-cli-CbG4PAoP.js} +5 -5
  50. package/dist/{models-cli-BHN3bt0f.js → models-cli-D9bmuwoB.js} +6 -6
  51. package/dist/{onboard-DGp6mHJD.js → onboard-BY-QnWdl.js} +1 -1
  52. package/dist/{onboard-BNdKimpG.js → onboard-BdPqyQmJ.js} +1 -1
  53. package/dist/{onboard-channels-Dhb-28-_.js → onboard-channels-Bzi2ck6V.js} +1 -1
  54. package/dist/{onboard-channels-DSBWRjSp.js → onboard-channels-C8bsROUq.js} +1 -1
  55. package/dist/{onboarding-BG23DuS1.js → onboarding-Ccnav61g.js} +3 -3
  56. package/dist/{onboarding-MPSU9pXd.js → onboarding-Hbt4RoTz.js} +3 -3
  57. package/dist/{onboarding.finalize-Cv20GyNt.js → onboarding.finalize--xJkztAR.js} +3 -3
  58. package/dist/{onboarding.finalize-B-mxzJ08.js → onboarding.finalize-OpyyTxY1.js} +4 -4
  59. package/dist/{pi-embedded-V-5MAZNb.js → pi-embedded-RgjY3r6K.js} +92 -10
  60. package/dist/{plugin-registry-c3Skr0q9.js → plugin-registry-B_NJFVHQ.js} +1 -1
  61. package/dist/{plugin-registry-CBV_Y6Dj.js → plugin-registry-X13tkCTS.js} +1 -1
  62. package/dist/plugin-sdk/index.js +6 -6
  63. package/dist/{plugins-cli-8Jo1X8SU.js → plugins-cli-C4bJxBRh.js} +5 -5
  64. package/dist/{plugins-cli-Dl7-FSCq.js → plugins-cli-DtdwfV-d.js} +5 -5
  65. package/dist/{program-context-BpeLcVUB.js → program-context-YblB1bz7.js} +18 -18
  66. package/dist/{program-D-LYHEvk.js → program-qzq3Lh15.js} +10 -10
  67. package/dist/{prompt-select-styled-ZWxB2Odf.js → prompt-select-styled-B_ial7p9.js} +4 -4
  68. package/dist/{prompt-select-styled-Ceih9wkY.js → prompt-select-styled-CQDea8e4.js} +4 -4
  69. package/dist/{provider-auth-helpers-BdvW7eau.js → provider-auth-helpers-BcP3qXzm.js} +1 -1
  70. package/dist/{provider-auth-helpers-BCejcf5o.js → provider-auth-helpers-BjVtTJHF.js} +1 -1
  71. package/dist/{push-apns-D4iLNyBo.js → push-apns-BWhqnXlG.js} +1 -1
  72. package/dist/{push-apns-HQd5hCpM.js → push-apns-D5FHZT1S.js} +1 -1
  73. package/dist/{pw-ai-v__CyAlM.js → pw-ai-DOAsQ5NX.js} +1 -1
  74. package/dist/{register.agent-DoUbqZIu.js → register.agent-BDw4ZFQo.js} +9 -9
  75. package/dist/{register.agent-zwVEiCHs.js → register.agent-DBb8ssU_.js} +8 -8
  76. package/dist/{register.configure-jBKvvOnk.js → register.configure-ClTC_gFo.js} +8 -8
  77. package/dist/{register.configure-CSe8Rlda.js → register.configure-DwN6_ucd.js} +8 -8
  78. package/dist/{register.maintenance-BdikNAV1.js → register.maintenance-C4EBdIW-.js} +9 -9
  79. package/dist/{register.maintenance-royLmVA2.js → register.maintenance-J8-7UEyc.js} +8 -8
  80. package/dist/{register.message-C_0uLdYn.js → register.message-CBkdglWp.js} +5 -5
  81. package/dist/{register.message-C1H5Vcnb.js → register.message-DkhnvbOo.js} +5 -5
  82. package/dist/{register.onboard-DTLtb0SN.js → register.onboard-B62sO2YM.js} +2 -2
  83. package/dist/{register.onboard-DnMRUtnl.js → register.onboard-BTM1uWDL.js} +2 -2
  84. package/dist/{register.setup-KA8Cs3HJ.js → register.setup-C7ai_6EG.js} +2 -2
  85. package/dist/{register.setup-B9sjRH7l.js → register.setup-X1z8nL1f.js} +2 -2
  86. package/dist/{register.status-health-sessions-BwiKHLEj.js → register.status-health-sessions-PBqHdGtS.js} +3 -3
  87. package/dist/{register.status-health-sessions-B_jcsH3c.js → register.status-health-sessions-oi4VY1yI.js} +3 -3
  88. package/dist/{register.subclis-B_V8vNI0.js → register.subclis-C1nbYmb-.js} +9 -9
  89. package/dist/{run-main-DhgQtxI0.js → run-main-Dcnq5F34.js} +17 -17
  90. package/dist/{server-methods-Bdz-OwQ4.js → server-methods-B8BrOzmI.js} +7 -7
  91. package/dist/{server-methods-6-10RyMD.js → server-methods-Cb-Z7rAJ.js} +7 -7
  92. package/dist/{server-node-events-C4giIb7q.js → server-node-events-BHcTrVe6.js} +6 -6
  93. package/dist/{server-node-events-B3Yey3h9.js → server-node-events-DnbQWd7e.js} +6 -6
  94. package/dist/{status-BRUIJsUm.js → status-CMnu_ZM8.js} +1 -1
  95. package/dist/{status-D_0593yR.js → status-DtfiqHU9.js} +1 -1
  96. package/dist/{status-B_CQpjQ9.js → status-KQBTdecN.js} +1 -1
  97. package/dist/{status-CCAO6ZHm.js → status-qu-13pDh.js} +1 -1
  98. package/dist/{subagent-registry-D8BIWG9Q.js → subagent-registry-BagjubTG.js} +85 -3
  99. package/dist/{synthesis-qvteT0Ti.js → synthesis-BFginQes.js} +4 -4
  100. package/dist/{synthesis-BfVWACNx.js → synthesis-CNxkpSl0.js} +4 -4
  101. package/dist/{synthesis-CV94EuT_.js → synthesis-CjbRZN2u.js} +4 -4
  102. package/dist/{synthesis-Bfhs-a4F.js → synthesis-CzEJh0zD.js} +2 -2
  103. package/dist/{unified-runner-C7BRCFJF.js → unified-runner-B2uJpfUK.js} +85 -3
  104. package/dist/{unified-runner-CtSJoaGS.js → unified-runner-BoNa4zCp.js} +85 -3
  105. package/dist/{update-cli-CUos9qgT.js → update-cli-D6uHO0yM.js} +9 -9
  106. package/dist/{update-cli-BrryYmFA.js → update-cli-Dj7wVif6.js} +8 -8
  107. package/extensions/memory-core/package.json +1 -1
  108. package/extensions/msteams/CHANGELOG.md +12 -0
  109. package/extensions/msteams/package.json +1 -1
  110. package/extensions/open-prose/package.json +1 -1
  111. package/extensions/outlook/package.json +1 -1
  112. package/extensions/slack/package.json +1 -1
  113. package/package.json +1 -1
@@ -2333,6 +2333,168 @@ body {
2333
2333
  background: rgba(0, 212, 255, 0.06);
2334
2334
  }
2335
2335
 
2336
+ /* ── Stage F.1: Tool-call cards ────────────────────────────────────────
2337
+ Compact card surfacing what tool the agent is firing right now. Tool
2338
+ name lives in the header (monospace, uppercased). The body slot shows
2339
+ the args meta on top + a status row (dot + duration/state) below.
2340
+
2341
+ Status dot:
2342
+ firing → cyan pulse (animation infinite)
2343
+ done → green solid
2344
+ error → pink solid
2345
+ The pulse animation is named symframe-tool-firing to avoid clashing
2346
+ with the substrate's intent-producing-pulse.
2347
+ */
2348
+ .symframe-card[data-card-type="tool"] {
2349
+ padding: var(--sf-pad-md) var(--sf-pad-lg);
2350
+ }
2351
+ .symframe-card[data-card-type="tool"] .symframe-card-header {
2352
+ font-family: var(--font-mono);
2353
+ font-size: var(--sf-text-sm);
2354
+ letter-spacing: 0.06em;
2355
+ text-transform: lowercase;
2356
+ }
2357
+ .symframe-body-tool {
2358
+ display: flex;
2359
+ flex-direction: column;
2360
+ gap: var(--sf-pad-xs);
2361
+ font-family: var(--font-mono);
2362
+ font-size: var(--sf-text-xs);
2363
+ }
2364
+ .symframe-tool-meta {
2365
+ color: var(--text-dim);
2366
+ letter-spacing: 0.02em;
2367
+ word-break: break-all;
2368
+ /* Clip to 2 lines so long shell commands / paths don't push the card huge */
2369
+ display: -webkit-box;
2370
+ -webkit-line-clamp: 2;
2371
+ line-clamp: 2;
2372
+ -webkit-box-orient: vertical;
2373
+ overflow: hidden;
2374
+ }
2375
+ .symframe-tool-status-row {
2376
+ display: flex;
2377
+ align-items: center;
2378
+ gap: var(--sf-pad-sm);
2379
+ font-size: var(--sf-text-xs);
2380
+ color: var(--text-dim);
2381
+ opacity: 0.85;
2382
+ }
2383
+ .symframe-tool-status-dot {
2384
+ width: var(--sf-pad-md);
2385
+ height: var(--sf-pad-md);
2386
+ border-radius: var(--sf-radius-pill);
2387
+ background: var(--sf-cyan-flash);
2388
+ box-shadow: 0 0 4px var(--sf-cyan-pulse);
2389
+ }
2390
+ .symframe-body-tool[data-tool-status="firing"] .symframe-tool-status-dot {
2391
+ animation: symframe-tool-firing var(--sf-time-pulse) ease-in-out infinite;
2392
+ }
2393
+ .symframe-body-tool[data-tool-status="done"] .symframe-tool-status-dot {
2394
+ background: var(--sf-green-peak);
2395
+ box-shadow: 0 0 4px var(--sf-green-strong);
2396
+ }
2397
+ .symframe-body-tool[data-tool-status="error"] .symframe-tool-status-dot {
2398
+ background: var(--sf-pink-text);
2399
+ box-shadow: 0 0 4px var(--sf-pink-strong);
2400
+ }
2401
+ .symframe-body-tool[data-tool-status="done"] .symframe-tool-status-text,
2402
+ .symframe-body-tool[data-tool-status="error"] .symframe-tool-status-text {
2403
+ color: var(--text-bright);
2404
+ }
2405
+ @keyframes symframe-tool-firing {
2406
+ 0%,
2407
+ 100% {
2408
+ opacity: 0.4;
2409
+ transform: scale(0.85);
2410
+ }
2411
+ 50% {
2412
+ opacity: 1;
2413
+ transform: scale(1);
2414
+ }
2415
+ }
2416
+ @media (prefers-reduced-motion: reduce) {
2417
+ .symframe-body-tool[data-tool-status="firing"] .symframe-tool-status-dot {
2418
+ animation: none;
2419
+ opacity: 0.7;
2420
+ }
2421
+ }
2422
+
2423
+ /* ── Stage F.2: Memory cards ───────────────────────────────────────────
2424
+ Surfaces which memory entries are influencing the current response.
2425
+ Uses intent="holding" (cyan stripe — working memory) but overrides
2426
+ the corner ribbon to read "RECALL" instead of "HOLDING" so the user
2427
+ knows this is a retrieved memory, not a generic working-memory card.
2428
+
2429
+ Each memory has a type badge (user/feedback/project/reference) that
2430
+ color-codes the badge chip to match the intent palette already
2431
+ established by Stage D.1.
2432
+ */
2433
+ .symframe-card[data-card-type="memory"][data-intent="holding"]::before {
2434
+ content: "recall";
2435
+ }
2436
+ .symframe-card[data-card-type="memory"] .symframe-card-header {
2437
+ font-family: var(--font-mono);
2438
+ font-size: var(--sf-text-sm);
2439
+ letter-spacing: 0.04em;
2440
+ }
2441
+ .symframe-body-memory {
2442
+ display: flex;
2443
+ flex-direction: column;
2444
+ gap: var(--sf-pad-sm);
2445
+ font-family: var(--font-mono);
2446
+ font-size: var(--sf-text-xs);
2447
+ }
2448
+ .symframe-memory-type {
2449
+ align-self: flex-start;
2450
+ padding: var(--sf-pad-xs) var(--sf-pad-md);
2451
+
2452
+ border-radius: var(--sf-radius-xs);
2453
+ font-size: var(--sf-text-xs);
2454
+ letter-spacing: 0.1em;
2455
+ text-transform: uppercase;
2456
+ font-weight: 700;
2457
+ background: var(--sf-cyan-veil);
2458
+ color: var(--accent-cyan);
2459
+ border: 1px solid var(--sf-cyan-edge);
2460
+ }
2461
+ .symframe-body-memory[data-memory-type="user"] .symframe-memory-type {
2462
+ background: var(--sf-pink-tint);
2463
+ color: var(--sf-pink-text);
2464
+ border-color: var(--sf-pink-edge);
2465
+ }
2466
+ .symframe-body-memory[data-memory-type="feedback"] .symframe-memory-type {
2467
+ background: var(--sf-amber-tint);
2468
+ color: #f5b73a;
2469
+ border-color: var(--sf-amber-edge);
2470
+ }
2471
+ .symframe-body-memory[data-memory-type="project"] .symframe-memory-type {
2472
+ background: var(--sf-green-tint);
2473
+ color: var(--sf-green-strong);
2474
+ border-color: var(--sf-green-edge);
2475
+ }
2476
+ .symframe-body-memory[data-memory-type="reference"] .symframe-memory-type {
2477
+ background: var(--sf-violet-tint);
2478
+ color: #8b5cf6;
2479
+ border-color: var(--sf-violet-edge);
2480
+ }
2481
+ .symframe-memory-description {
2482
+ color: var(--text);
2483
+ line-height: 1.4;
2484
+ /* Clamp to 3 lines so a long description doesn't dominate */
2485
+ display: -webkit-box;
2486
+ -webkit-line-clamp: 3;
2487
+ line-clamp: 3;
2488
+ -webkit-box-orient: vertical;
2489
+ overflow: hidden;
2490
+ }
2491
+ .symframe-memory-path {
2492
+ color: var(--text-dim);
2493
+ font-size: var(--sf-text-xs);
2494
+ opacity: 0.65;
2495
+ word-break: break-all;
2496
+ }
2497
+
2336
2498
  /* ── Response Area ────────────────────────────────────────────────── */
2337
2499
  .response-area {
2338
2500
  position: fixed;
@@ -242,6 +242,85 @@
242
242
  return a;
243
243
  }
244
244
 
245
+ // Stage F.1 (3.5.33): tool-call cards. Compact card surfacing what the
246
+ // agent is doing in real time — tool name + args meta + status + duration.
247
+ // Pushed by the server-side tool execution start/end hooks; auto-released
248
+ // 3s after completion via the releaseAfterMs field honored by add().
249
+ function renderToolBody(card) {
250
+ const wrap = document.createElement("div");
251
+ wrap.className = "symframe-body-tool";
252
+ wrap.dataset.toolStatus = card.toolStatus || "firing";
253
+
254
+ if (card.toolMeta) {
255
+ const meta = document.createElement("div");
256
+ meta.className = "symframe-tool-meta";
257
+ meta.textContent = card.toolMeta;
258
+ wrap.appendChild(meta);
259
+ }
260
+
261
+ const statusRow = document.createElement("div");
262
+ statusRow.className = "symframe-tool-status-row";
263
+ const dot = document.createElement("span");
264
+ dot.className = "symframe-tool-status-dot";
265
+ statusRow.appendChild(dot);
266
+ const statusText = document.createElement("span");
267
+ statusText.className = "symframe-tool-status-text";
268
+ if (card.toolStatus === "done") {
269
+ statusText.textContent = formatDuration(card.toolDurationMs);
270
+ } else if (card.toolStatus === "error") {
271
+ statusText.textContent = `error · ${formatDuration(card.toolDurationMs)}`;
272
+ } else {
273
+ statusText.textContent = "running";
274
+ }
275
+ statusRow.appendChild(statusText);
276
+ wrap.appendChild(statusRow);
277
+
278
+ return wrap;
279
+ }
280
+
281
+ function formatDuration(ms) {
282
+ if (ms == null) {
283
+ return "";
284
+ }
285
+ if (ms < 1000) {
286
+ return `${ms}ms`;
287
+ }
288
+ return `${(ms / 1000).toFixed(1)}s`;
289
+ }
290
+
291
+ // Stage F.2 (3.5.34): memory cards. Surface which memory entries are
292
+ // shaping the current turn — pushed by the auto-recall path when memory
293
+ // search retrieves snippets at prompt-build time. Releases ~60s later
294
+ // so the user sees what informed the response while it streams.
295
+ function renderMemoryBody(card) {
296
+ const wrap = document.createElement("div");
297
+ wrap.className = "symframe-body-memory";
298
+ wrap.dataset.memoryType = card.memoryType || "memory";
299
+
300
+ if (card.memoryType) {
301
+ const badge = document.createElement("span");
302
+ badge.className = "symframe-memory-type";
303
+ badge.textContent = card.memoryType;
304
+ wrap.appendChild(badge);
305
+ }
306
+
307
+ if (card.memoryDescription) {
308
+ const desc = document.createElement("div");
309
+ desc.className = "symframe-memory-description";
310
+ desc.textContent = card.memoryDescription;
311
+ wrap.appendChild(desc);
312
+ }
313
+
314
+ if (card.memoryPath) {
315
+ const path = document.createElement("div");
316
+ path.className = "symframe-memory-path";
317
+ path.textContent = card.memoryPath;
318
+ wrap.appendChild(path);
319
+ }
320
+
321
+ return wrap;
322
+ }
323
+
245
324
  const renderers = {
246
325
  text: renderTextBody,
247
326
  markdown: renderMarkdownBody,
@@ -250,6 +329,8 @@
250
329
  pdf: renderPdfBody,
251
330
  audio: renderAudioBody,
252
331
  video: renderVideoBody,
332
+ tool: renderToolBody,
333
+ memory: renderMemoryBody,
253
334
  };
254
335
 
255
336
  function renderBodyForType(card) {
@@ -271,6 +352,14 @@
271
352
  if (card.email && typeof card.email === "object") {
272
353
  return true;
273
354
  }
355
+ // Stage F.1: tool cards carry their data in dedicated fields, not body
356
+ if (card.type === "tool" && (card.toolMeta || card.toolStatus)) {
357
+ return true;
358
+ }
359
+ // Stage F.2: memory cards carry their data in dedicated fields, not body
360
+ if (card.type === "memory" && (card.memoryDescription || card.memoryPath)) {
361
+ return true;
362
+ }
274
363
  return false;
275
364
  }
276
365
 
@@ -486,6 +575,37 @@
486
575
  return entry;
487
576
  }
488
577
 
578
+ // Stage F.1: per-card auto-release timers keyed by card id. Honored by
579
+ // add() and update() when the card carries releaseAfterMs.
580
+ const releaseTimers = new Map();
581
+
582
+ function scheduleAutoRelease(id, releaseAfterMs) {
583
+ if (!Number.isFinite(releaseAfterMs) || releaseAfterMs <= 0) {
584
+ return;
585
+ }
586
+ const prev = releaseTimers.get(id);
587
+ if (prev) {
588
+ clearTimeout(prev);
589
+ }
590
+ const timer = setTimeout(() => {
591
+ releaseTimers.delete(id);
592
+ try {
593
+ release(id);
594
+ } catch (err) {
595
+ console.warn("[symframe] auto-release failed:", id, err);
596
+ }
597
+ }, releaseAfterMs);
598
+ releaseTimers.set(id, timer);
599
+ }
600
+
601
+ function cancelAutoRelease(id) {
602
+ const timer = releaseTimers.get(id);
603
+ if (timer) {
604
+ clearTimeout(timer);
605
+ releaseTimers.delete(id);
606
+ }
607
+ }
608
+
489
609
  /**
490
610
  * Add a new dynamic card. Renders into the container, prepended for
491
611
  * ephemeral cards or appended for sticky cards.
@@ -514,6 +634,10 @@
514
634
  if (modeState.current === "focus" && modeState.focusedId === id) {
515
635
  el.classList.add("symframe-card-focused");
516
636
  }
637
+ // Stage F.1: honor releaseAfterMs from the card payload.
638
+ if (Number.isFinite(card?.releaseAfterMs) && card.releaseAfterMs > 0) {
639
+ scheduleAutoRelease(id, card.releaseAfterMs);
640
+ }
517
641
  return entry;
518
642
  }
519
643
 
@@ -559,6 +683,15 @@
559
683
  if (modeState.current === "focus" && modeState.focusedId === id) {
560
684
  newEl.classList.add("symframe-card-focused");
561
685
  }
686
+ // Stage F.1: a patch may carry releaseAfterMs (e.g. tool result hook
687
+ // schedules a 3s release). Always cancel any prior timer first so an
688
+ // update can re-extend or cancel (releaseAfterMs: 0).
689
+ if (patch && Object.hasOwn(patch, "releaseAfterMs")) {
690
+ cancelAutoRelease(id);
691
+ if (Number.isFinite(patch.releaseAfterMs) && patch.releaseAfterMs > 0) {
692
+ scheduleAutoRelease(id, patch.releaseAfterMs);
693
+ }
694
+ }
562
695
  return merged;
563
696
  }
564
697
 
@@ -582,6 +715,7 @@
582
715
  console.warn(`[symframe] remove: refusing to drop sticky card '${id}' without force=true`);
583
716
  return false;
584
717
  }
718
+ cancelAutoRelease(id);
585
719
  if (entry.element && entry.element.parentElement === container) {
586
720
  entry.element.remove();
587
721
  }
@@ -743,6 +877,7 @@
743
877
  console.warn(`[symframe] release: refusing sticky card '${id}' without force=true`);
744
878
  return false;
745
879
  }
880
+ cancelAutoRelease(id);
746
881
  // Snapshot for recall (strip the live DOM element)
747
882
  const snapshot = { ...entry };
748
883
  delete snapshot.element;
@@ -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,
@@ -1,7 +1,7 @@
1
1
  import { n as resolveCliName } from "./cli-name-DY75UA5M.js";
2
2
  import { t as resolveSymiPackageRoot } from "./symi-root-Ctw1Rb_n.js";
3
3
  import { t as note } from "./note-BIAQpZxi.js";
4
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-vAwL_uEK.js";
4
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-Dcc5-bYY.js";
5
5
  import { spawnSync } from "node:child_process";
6
6
  import path from "node:path";
7
7
 
@@ -1,7 +1,7 @@
1
1
  import { n as resolveCliName } from "./cli-name-CzMV-gJF.js";
2
2
  import { t as resolveSymiPackageRoot } from "./symi-root-BQ0IpoW2.js";
3
3
  import { t as note } from "./note-D9FXI2qW.js";
4
- import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-CsJ2f_fk.js";
4
+ import { a as resolveCompletionCachePath, i as isCompletionInstalled, o as resolveShellFromEnv, r as installCompletion, s as usesSlowDynamicCompletion, t as completionCacheExists } from "./completion-cli-DewJuifK.js";
5
5
  import path from "node:path";
6
6
  import { spawnSync } from "node:child_process";
7
7
 
package/dist/entry.js CHANGED
@@ -2315,7 +2315,7 @@ if (!ensureExperimentalWarningSuppressed()) {
2315
2315
  applyCliProfileEnv({ profile: parsed.profile });
2316
2316
  process$1.argv = parsed.argv;
2317
2317
  }
2318
- import("./run-main-DhgQtxI0.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
2318
+ import("./run-main-Dcnq5F34.js").then(({ runCli }) => runCli(process$1.argv)).catch((error) => {
2319
2319
  console.error("[symi] Failed to start CLI:", error instanceof Error ? error.stack ?? error.message : error);
2320
2320
  process$1.exitCode = 1;
2321
2321
  });
@@ -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-RgjY3r6K.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-CAdF4u2G.js";
27
27
  import "./github-copilot-token-dYUr1mDQ.js";
28
28
  import "./sqlite-D8iYC_CU.js";
29
29
  import "./markdown-tables-jQzXAsf3.js";
@@ -26,7 +26,7 @@ import "./pairing-token-B-OTYROz.js";
26
26
  import { t as safeEqualSecret } from "./secret-equal-CDUVxXmp.js";
27
27
  import { a as isValidIPv4, c as resolveClientIp, d as resolveHostName, f as rawDataToString, i as isTrustedProxyAddress, l as resolveGatewayBindHost, n as isLoopbackHost, o as normalizeHostHeader, t as isLoopbackAddress, u as resolveGatewayListenHosts } from "./net-TZUXtwGR.js";
28
28
  import { n as pickPrimaryTailnetIPv4, r as pickPrimaryTailnetIPv6 } from "./tailnet-B2SPYrh4.js";
29
- import { $ as normalizeHttpWebhookUrl, $t as resolveInputFileLimits, Cn as emitAgentEvent, Ct as deferGatewayRestartUntilIdle, D as getActiveEmbeddedRunCount, En as registerAgentRunContext, Et as markGatewaySigusr1RestartHandled, F as createSymiTools, Gt as registerUnhandledRejectionHandler, H as resolveOutboundSessionRoute, Jt as DEFAULT_INPUT_MAX_REDIRECTS, Kt as DEFAULT_INPUT_IMAGE_MAX_BYTES, M as resolveModelProfile, Ot as setGatewaySigusr1RestartPolicy, Qt as normalizeMimeList, R as readLatestAssistantReply, S as getTotalPendingReplies, Sn as clearAgentRunContext, St as consumeGatewaySigusr1RestartAuthorization, T as runAgentTurn, Tn as onAgentEvent, Tt as isGatewaySigusr1RestartExternallyAllowed, U as resolveOutboundTarget, W as resolveSessionDeliveryTarget, Xt as extractFileContentFromSource, Y as runWithModelFallback, Yt as DEFAULT_INPUT_TIMEOUT_MS, Zt as extractImageContentFromSource, _ as requestBodyErrorToText, _n as getTotalQueueSize, _t as isExternalHookSession, at as normalizeOptionalText, bn as waitForActiveTasks, ct as migrateLegacyCronPayload, dn as formatUserTime, dt as stripLegacyDeliveryFields, f as getPluginToolMeta, fn as resolveUserTimeFormat, g as readJsonBodyWithLimit, gn as getActiveTaskCount, gt as getHookType, h as handleSlackHttpRequest, ht as detectSuspiciousPatterns, i as listDescendantRunsForRequester, it as normalizeOptionalSessionKey, j as classifyOutboundMessage, kt as setPreRestartDeferralCheck, l as applyToolPolicyPipeline, ln as ToolInputError, lt as buildDeliveryFromLegacyPayload, m as loadSymiPlugins, mt as buildSafeExternalPrompt, n as countActiveRunsForSession, nt as inferLegacyName, ot as normalizePayloadToSystemText, pn as resolveUserTimezone, q as resetDirectoryCache, qt as DEFAULT_INPUT_IMAGE_MIMES, r as initSubagentRegistry, rt as normalizeOptionalAgentId, s as runSubagentAnnounceFlow, st as normalizeRequiredName, t as countActiveDescendantRuns, tn as resolveAgentTimeoutMs, u as buildDefaultToolPolicyPipelineSteps, ut as hasLegacyDeliveryHints, v as buildHistoryContextFromEntries, vn as resetAllLanes, wn as getAgentRunContext, wt as emitGatewayRestart, xn as CommandLane, yn as setCommandLaneConcurrency, z as resolveAnnounceTargetFromKey } from "./subagent-registry-D8BIWG9Q.js";
29
+ import { $ as normalizeHttpWebhookUrl, $t as resolveInputFileLimits, Cn as emitAgentEvent, Ct as deferGatewayRestartUntilIdle, D as getActiveEmbeddedRunCount, En as registerAgentRunContext, Et as markGatewaySigusr1RestartHandled, F as createSymiTools, Gt as registerUnhandledRejectionHandler, H as resolveOutboundSessionRoute, Jt as DEFAULT_INPUT_MAX_REDIRECTS, Kt as DEFAULT_INPUT_IMAGE_MAX_BYTES, M as resolveModelProfile, Ot as setGatewaySigusr1RestartPolicy, Qt as normalizeMimeList, R as readLatestAssistantReply, S as getTotalPendingReplies, Sn as clearAgentRunContext, St as consumeGatewaySigusr1RestartAuthorization, T as runAgentTurn, Tn as onAgentEvent, Tt as isGatewaySigusr1RestartExternallyAllowed, U as resolveOutboundTarget, W as resolveSessionDeliveryTarget, Xt as extractFileContentFromSource, Y as runWithModelFallback, Yt as DEFAULT_INPUT_TIMEOUT_MS, Zt as extractImageContentFromSource, _ as requestBodyErrorToText, _n as getTotalQueueSize, _t as isExternalHookSession, at as normalizeOptionalText, bn as waitForActiveTasks, ct as migrateLegacyCronPayload, dn as formatUserTime, dt as stripLegacyDeliveryFields, f as getPluginToolMeta, fn as resolveUserTimeFormat, g as readJsonBodyWithLimit, gn as getActiveTaskCount, gt as getHookType, h as handleSlackHttpRequest, ht as detectSuspiciousPatterns, i as listDescendantRunsForRequester, it as normalizeOptionalSessionKey, j as classifyOutboundMessage, kt as setPreRestartDeferralCheck, l as applyToolPolicyPipeline, ln as ToolInputError, lt as buildDeliveryFromLegacyPayload, m as loadSymiPlugins, mt as buildSafeExternalPrompt, n as countActiveRunsForSession, nt as inferLegacyName, ot as normalizePayloadToSystemText, pn as resolveUserTimezone, q as resetDirectoryCache, qt as DEFAULT_INPUT_IMAGE_MIMES, r as initSubagentRegistry, rt as normalizeOptionalAgentId, s as runSubagentAnnounceFlow, st as normalizeRequiredName, t as countActiveDescendantRuns, tn as resolveAgentTimeoutMs, u as buildDefaultToolPolicyPipelineSteps, ut as hasLegacyDeliveryHints, v as buildHistoryContextFromEntries, vn as resetAllLanes, wn as getAgentRunContext, wt as emitGatewayRestart, xn as CommandLane, yn as setCommandLaneConcurrency, z as resolveAnnounceTargetFromKey } from "./subagent-registry-BagjubTG.js";
30
30
  import { D as resolveSessionResetPolicy, F as resolveMainSessionKey, H as cleanStaleLockFiles, I as resolveMainSessionKeyFromConfig, K as mergeDeliveryContext, M as canonicalizeMainSessionAlias, N as resolveAgentMainSessionKey, T as evaluateSessionFreshness, W as deliveryContextFromSession, d as updateSessionStore, n as parseSessionThreadInfo, o as loadSessionStore } from "./sessions-Dn6VXn4p.js";
31
31
  import { n as listChannelPlugins, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-BsEhWvLn.js";
32
32
  import "./send-Dq252-bi.js";
@@ -56,8 +56,8 @@ import "./model-auth-Byr7Gic_.js";
56
56
  import "./github-copilot-token-B5y4__YM.js";
57
57
  import "./models-config-CiR_RUxw.js";
58
58
  import { a as resolveAgentIdentity } from "./reply-prefix-DV3KhOhL.js";
59
- import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-CTf9MdBg.js";
60
- import { c as resolveMemorySearchConfig } from "./manager-XfNxjaX5.js";
59
+ import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-7DZfwFEz.js";
60
+ import { c as resolveMemorySearchConfig } from "./manager-DSXvXUZQ.js";
61
61
  import "./sqlite-9jF_eajd.js";
62
62
  import "./chunk-B2lBXhR0.js";
63
63
  import "./markdown-tables-BEdkErjm.js";
@@ -90,7 +90,7 @@ import { t as formatDocsLink } from "./links-Dnmd-RS-.js";
90
90
  import { n as runCommandWithRuntime } from "./cli-utils-DXfA5936.js";
91
91
  import { t as formatHelpExamples } from "./help-format-Dbp8yEhl.js";
92
92
  import { n as withProgress } from "./progress-CI19Xh3z.js";
93
- import "./memory-cli-CA5PbH9y.js";
93
+ import "./memory-cli-CGqqpDlw.js";
94
94
  import "./logging-UO6tk8Em.js";
95
95
  import "./replies-CLREUzzB.js";
96
96
  import { a as resolveSubagentToolPolicy, i as resolveGroupToolPolicy, r as resolveEffectiveToolPolicy } from "./pi-tools.policy-06k__URR.js";
@@ -117,17 +117,17 @@ import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } fr
117
117
  import { i as toOptionString, n as extractGatewayMiskeys, r as maybeExplainGatewayServiceStop, t as describeUnknownError } from "./shared-Dl4ZrOve.js";
118
118
  import { c as resolveNodeCommandAllowlist, l as probeGateway, n as DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "./audit-DyncRBKq.js";
119
119
  import { t as discoverGatewayBeacons } from "./bonjour-discovery-XbH0AYJ4.js";
120
- import { i as pickGatewaySelfPresence } from "./status-D_0593yR.js";
120
+ import { i as pickGatewaySelfPresence } from "./status-DtfiqHU9.js";
121
121
  import { a as styleHealthChannelLine, n as getHealthSnapshot, t as formatHealthChannelLines } from "./health-Dkwuq8ta.js";
122
122
  import { n as createDefaultDeps, t as createOutboundSendDeps } from "./outbound-send-deps-BCyarBRf.js";
123
123
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-Dnz69KRU.js";
124
124
  import { t as ensureSymiCliOnPath } from "./path-env-SUrcTSJ-.js";
125
125
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, m as normalizeUpdateChannel, n as compareSemverStrings, t as checkUpdateStatus } from "./update-check-DLOnLuop.js";
126
- import { t as runOnboardingWizard } from "./onboarding-MPSU9pXd.js";
127
- import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-Bdz-OwQ4.js";
128
- import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-D4iLNyBo.js";
126
+ import { t as runOnboardingWizard } from "./onboarding-Hbt4RoTz.js";
127
+ import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-B8BrOzmI.js";
128
+ import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-BWhqnXlG.js";
129
129
  import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-BYBwPfuu.js";
130
- import { a as getCliSessionId, o as setCliSessionId, s as runCliAgent, t as agentCommand } from "./agent-TRt_SsAW.js";
130
+ import { a as getCliSessionId, o as setCliSessionId, s as runCliAgent, t as agentCommand } from "./agent-Dyqpglpp.js";
131
131
  import { s as loadAgentIdentityFromWorkspace } from "./agents.config-CqfMQEiy.js";
132
132
  import "./dm-policy-shared-BtrdvOIT.js";
133
133
  import "./node-service-CZlyWmxa.js";
@@ -12046,7 +12046,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
12046
12046
  });
12047
12047
  let glassUiBridgeCleanup = null;
12048
12048
  if (!minimalTestGateway) {
12049
- const { createGlassUiBridge } = await import("./glass-ui-ws-BK5qk7-_.js");
12049
+ const { createGlassUiBridge } = await import("./glass-ui-ws-CZkskC04.js");
12050
12050
  glassUiBridgeCleanup = createGlassUiBridge({
12051
12051
  wss: glassUiWss,
12052
12052
  context: gatewayRequestContext,
@@ -1,4 +1,4 @@
1
- import { $ as isExternalHookSession, $t as emitAgentEvent, A as resolveSessionDeliveryTarget, At as resolveInputFileLimits, B as normalizeOptionalSessionKey, Bt as countActiveDescendantRuns, Cn as CommandLane, Ct as DEFAULT_INPUT_IMAGE_MAX_BYTES, Dn as runWithModelFallback, Dt as extractFileContentFromSource, Et as DEFAULT_INPUT_TIMEOUT_MS, F as normalizeHttpWebhookUrl, G as buildDeliveryFromLegacyPayload, H as normalizePayloadToSystemText, Ht as initSubagentRegistry, Jt as readLatestAssistantReply, K as hasLegacyDeliveryHints, Kt as resolveAgentTimeoutMs, N as resetDirectoryCache, O as resolveOutboundSessionRoute, Ot as extractImageContentFromSource, Q as getHookType, Qt as clearAgentRunContext, R as inferLegacyName, S as createSymiTools, Sn as waitForActiveTasks, T as resolveAnnounceTargetFromKey, Tn as resolveModelProfile, Tt as DEFAULT_INPUT_MAX_REDIRECTS, U as normalizeRequiredName, Ut as listDescendantRunsForRequester, V as normalizeOptionalText, Vt as countActiveRunsForSession, W as migrateLegacyCronPayload, X as buildSafeExternalPrompt, Z as detectSuspiciousPatterns, a as getPluginToolMeta, an as getActiveEmbeddedRunCount, at as isGatewaySigusr1RestartExternallyAllowed, bn as resetAllLanes, c as handleSlackHttpRequest, cn as registerUnhandledRejectionHandler, ct as setGatewaySigusr1RestartPolicy, d as buildHistoryContextFromEntries, dn as formatUserTime, en as getAgentRunContext, fn as resolveUserTimeFormat, h as getTotalPendingReplies, it as emitGatewayRestart, k as resolveOutboundTarget, kt as normalizeMimeList, l as readJsonBodyWithLimit, ln as ToolInputError, lt as setPreRestartDeferralCheck, n as applyToolPolicyPipeline, nn as registerAgentRunContext, nt as consumeGatewaySigusr1RestartAuthorization, ot as markGatewaySigusr1RestartHandled, pn as resolveUserTimezone, q as stripLegacyDeliveryFields, qt as runSubagentAnnounceFlow, r as buildDefaultToolPolicyPipelineSteps, rt as deferGatewayRestartUntilIdle, s as loadSymiPlugins, t as runAgentTurn, tn as onAgentEvent, u as requestBodyErrorToText, vn as getActiveTaskCount, wn as classifyOutboundMessage, wt as DEFAULT_INPUT_IMAGE_MIMES, xn as setCommandLaneConcurrency, yn as getTotalQueueSize, z as normalizeOptionalAgentId } from "./unified-runner-CtSJoaGS.js";
1
+ import { $ as isExternalHookSession, $t as emitAgentEvent, A as resolveSessionDeliveryTarget, At as resolveInputFileLimits, B as normalizeOptionalSessionKey, Bt as countActiveDescendantRuns, Cn as CommandLane, Ct as DEFAULT_INPUT_IMAGE_MAX_BYTES, Dn as runWithModelFallback, Dt as extractFileContentFromSource, Et as DEFAULT_INPUT_TIMEOUT_MS, F as normalizeHttpWebhookUrl, G as buildDeliveryFromLegacyPayload, H as normalizePayloadToSystemText, Ht as initSubagentRegistry, Jt as readLatestAssistantReply, K as hasLegacyDeliveryHints, Kt as resolveAgentTimeoutMs, N as resetDirectoryCache, O as resolveOutboundSessionRoute, Ot as extractImageContentFromSource, Q as getHookType, Qt as clearAgentRunContext, R as inferLegacyName, S as createSymiTools, Sn as waitForActiveTasks, T as resolveAnnounceTargetFromKey, Tn as resolveModelProfile, Tt as DEFAULT_INPUT_MAX_REDIRECTS, U as normalizeRequiredName, Ut as listDescendantRunsForRequester, V as normalizeOptionalText, Vt as countActiveRunsForSession, W as migrateLegacyCronPayload, X as buildSafeExternalPrompt, Z as detectSuspiciousPatterns, a as getPluginToolMeta, an as getActiveEmbeddedRunCount, at as isGatewaySigusr1RestartExternallyAllowed, bn as resetAllLanes, c as handleSlackHttpRequest, cn as registerUnhandledRejectionHandler, ct as setGatewaySigusr1RestartPolicy, d as buildHistoryContextFromEntries, dn as formatUserTime, en as getAgentRunContext, fn as resolveUserTimeFormat, h as getTotalPendingReplies, it as emitGatewayRestart, k as resolveOutboundTarget, kt as normalizeMimeList, l as readJsonBodyWithLimit, ln as ToolInputError, lt as setPreRestartDeferralCheck, n as applyToolPolicyPipeline, nn as registerAgentRunContext, nt as consumeGatewaySigusr1RestartAuthorization, ot as markGatewaySigusr1RestartHandled, pn as resolveUserTimezone, q as stripLegacyDeliveryFields, qt as runSubagentAnnounceFlow, r as buildDefaultToolPolicyPipelineSteps, rt as deferGatewayRestartUntilIdle, s as loadSymiPlugins, t as runAgentTurn, tn as onAgentEvent, u as requestBodyErrorToText, vn as getActiveTaskCount, wn as classifyOutboundMessage, wt as DEFAULT_INPUT_IMAGE_MIMES, xn as setCommandLaneConcurrency, yn as getTotalQueueSize, z as normalizeOptionalAgentId } from "./unified-runner-BoNa4zCp.js";
2
2
  import { A as isRich, E as setVerbose, H as createInternalHookEvent, M as getChildLogger, N as getLogger, P as getResolvedLoggerSettings, U as registerInternalHook, V as clearInternalHooks, W as triggerInternalHook, j as theme, k as colorize, m as createEmptyPluginRegistry, r as DEFAULT_CHAT_CHANNEL } from "./registry-Sbac4a4z.js";
3
3
  import { _ as resolveStateDir, i as isNixMode, l as resolveGatewayLockDir, o as resolveConfigPath, r as STATE_DIR, t as CONFIG_PATH, u as resolveGatewayPort, v as expandHomePrefix } from "./paths-By0XjHBk.js";
4
4
  import { h as resolveUserPath, s as ensureDir, t as CONFIG_DIR, v as shortenHomePath, x as truncateUtf16Safe } from "./utils-CTPsqyE_.js";
@@ -58,8 +58,8 @@ import { c as hasNonzeroUsage, s as deriveSessionTotalTokens } from "./session-c
58
58
  import { C as enqueueSystemEvent, a as loadCombinedSessionStoreForGateway, f as formatRestartSentinelMessage, i as listSessionsFromStore, m as summarizeRestartSentinel, o as loadSessionEntry, u as consumeRestartSentinel, x as lookupContextTokens } from "./session-utils-Cs1jlD-q.js";
59
59
  import { r as getMachineDisplayName } from "./with-timeout-DPR4A2dx.js";
60
60
  import { a as resolveAgentIdentity } from "./reply-prefix-BFNeXT65.js";
61
- import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-DOl2l2AS.js";
62
- import { c as resolveMemorySearchConfig } from "./manager-CL767Sv9.js";
61
+ import { n as resolveMemoryBackendConfig, t as getMemorySearchManager } from "./memory-CuBkKhKM.js";
62
+ import { c as resolveMemorySearchConfig } from "./manager-Dw6j9KTZ.js";
63
63
  import "./sqlite-Cod7C5ba.js";
64
64
  import "./chunk-BxfKjCUx.js";
65
65
  import "./markdown-tables-CS1Tvb3z.js";
@@ -92,7 +92,7 @@ import { t as formatDocsLink } from "./links-Bqr0FxXx.js";
92
92
  import { n as runCommandWithRuntime } from "./cli-utils-CuyGL3rq.js";
93
93
  import { t as formatHelpExamples } from "./help-format-7hFcsqss.js";
94
94
  import { n as withProgress } from "./progress-swt2y17x.js";
95
- import "./memory-cli-B9_Vfaow.js";
95
+ import "./memory-cli-C8h9g8yO.js";
96
96
  import "./logging-BWknayJl.js";
97
97
  import "./replies-CbXXjn9X.js";
98
98
  import { a as resolveSubagentToolPolicy, i as resolveGroupToolPolicy, r as resolveEffectiveToolPolicy } from "./pi-tools.policy-H2t-Xkfc.js";
@@ -124,15 +124,15 @@ import { n as resolveWideAreaDiscoveryDomain, r as writeWideAreaGatewayZone } fr
124
124
  import { i as toOptionString, n as extractGatewayMiskeys, r as maybeExplainGatewayServiceStop, t as describeUnknownError } from "./shared-1xPo9ygd.js";
125
125
  import { c as resolveNodeCommandAllowlist, l as probeGateway, n as DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "./audit-C_3fAFeS.js";
126
126
  import { t as discoverGatewayBeacons } from "./bonjour-discovery-CWTnBKX8.js";
127
- import { r as pickGatewaySelfPresence } from "./status-CCAO6ZHm.js";
127
+ import { r as pickGatewaySelfPresence } from "./status-qu-13pDh.js";
128
128
  import { i as styleHealthChannelLine, n as getHealthSnapshot, t as formatHealthChannelLines } from "./health-7UqIGG8U.js";
129
129
  import { a as resolveControlUiRootSync, i as resolveControlUiRootOverrideSync, t as ensureControlUiAssetsBuilt } from "./control-ui-assets-CJQ97d4u.js";
130
130
  import { a as resolveNpmChannelTag, c as DEFAULT_PACKAGE_CHANNEL, m as normalizeUpdateChannel, n as compareSemverStrings, t as checkUpdateStatus } from "./update-check-BCL_K7kx.js";
131
- import { t as runOnboardingWizard } from "./onboarding-BG23DuS1.js";
132
- import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-6-10RyMD.js";
133
- import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-HQd5hCpM.js";
131
+ import { t as runOnboardingWizard } from "./onboarding-Ccnav61g.js";
132
+ import { C as startGatewayConfigReloader, S as resolveCronRunLogPath, _ as MAX_PAYLOAD_BYTES, a as loadFavoritesSet, b as abortChatRunById, c as resolveAssistantIdentity, d as formatError, f as loadVoiceWakeConfig, g as MAX_BUFFERED_BYTES, h as HEALTH_REFRESH_INTERVAL_MS, i as safeParseJson, l as listSystemPresence, m as DEDUPE_TTL_MS, n as handleGatewayRequest, o as reconcileFavorites, p as DEDUPE_MAX, r as broadcastPresenceSnapshot, s as DEFAULT_ASSISTANT_IDENTITY, t as coreGatewayHandlers, u as upsertPresence, v as TICK_INTERVAL_MS, x as appendCronRunLog, y as getHandshakeTimeoutMs } from "./server-methods-Cb-Z7rAJ.js";
133
+ import { d as shouldLogWs, f as summarizeAgentEventForWsLog, l as formatForLog, p as setGatewayWsLogStyle, u as logWs } from "./push-apns-D5FHZT1S.js";
134
134
  import { T as resolveGmailHookRuntimeConfig, _ as buildGogWatchServeArgs, i as ensureTailscaleEndpoint, v as buildGogWatchStartArgs } from "./gmail-setup-utils-CGaQ7-Vb.js";
135
- import { a as getCliSessionId, o as setCliSessionId, s as runCliAgent, t as agentCommand } from "./agent-BsRYHa15.js";
135
+ import { a as getCliSessionId, o as setCliSessionId, s as runCliAgent, t as agentCommand } from "./agent-DkwJ_C7T.js";
136
136
  import { t as createOutboundSendDeps } from "./outbound-send-deps--SpwgFhS.js";
137
137
  import { s as loadAgentIdentityFromWorkspace } from "./agents.config-B7sNDvhz.js";
138
138
  import "./dm-policy-shared-CeFt0nch.js";
@@ -12051,7 +12051,7 @@ async function startGatewayServer(port = 18789, opts = {}) {
12051
12051
  });
12052
12052
  let glassUiBridgeCleanup = null;
12053
12053
  if (!minimalTestGateway) {
12054
- const { createGlassUiBridge } = await import("./glass-ui-ws-CrmnRYxe.js");
12054
+ const { createGlassUiBridge } = await import("./glass-ui-ws-BF5GGXNz.js");
12055
12055
  glassUiBridgeCleanup = createGlassUiBridge({
12056
12056
  wss: glassUiWss,
12057
12057
  context: gatewayRequestContext,
@@ -1,4 +1,4 @@
1
- import { Tn as resolveModelProfile } from "./unified-runner-CtSJoaGS.js";
1
+ import { Tn as resolveModelProfile } from "./unified-runner-BoNa4zCp.js";
2
2
  import "./registry-Sbac4a4z.js";
3
3
  import "./paths-By0XjHBk.js";
4
4
  import "./utils-CTPsqyE_.js";
@@ -50,8 +50,8 @@ import "./session-cost-usage-D3mgssM_.js";
50
50
  import "./session-utils-Cs1jlD-q.js";
51
51
  import "./with-timeout-DPR4A2dx.js";
52
52
  import "./reply-prefix-BFNeXT65.js";
53
- import "./memory-DOl2l2AS.js";
54
- import "./manager-CL767Sv9.js";
53
+ import "./memory-CuBkKhKM.js";
54
+ import "./manager-Dw6j9KTZ.js";
55
55
  import "./sqlite-Cod7C5ba.js";
56
56
  import "./chunk-BxfKjCUx.js";
57
57
  import "./markdown-tables-CS1Tvb3z.js";
@@ -82,7 +82,7 @@ import "./links-Bqr0FxXx.js";
82
82
  import "./cli-utils-CuyGL3rq.js";
83
83
  import "./help-format-7hFcsqss.js";
84
84
  import "./progress-swt2y17x.js";
85
- import "./memory-cli-B9_Vfaow.js";
85
+ import "./memory-cli-C8h9g8yO.js";
86
86
  import "./logging-BWknayJl.js";
87
87
  import "./replies-CbXXjn9X.js";
88
88
  import "./pi-tools.policy-H2t-Xkfc.js";
@@ -101,13 +101,13 @@ import "./service-e6MzlLCd.js";
101
101
  import "./diagnostics-DlZODdRf.js";
102
102
  import "./table-0A3xKJVC.js";
103
103
  import "./audit-C_3fAFeS.js";
104
- import "./status-CCAO6ZHm.js";
104
+ import "./status-qu-13pDh.js";
105
105
  import "./health-7UqIGG8U.js";
106
106
  import "./control-ui-assets-CJQ97d4u.js";
107
107
  import "./update-check-BCL_K7kx.js";
108
- import { n as handleGatewayRequest } from "./server-methods-6-10RyMD.js";
109
- import "./push-apns-HQd5hCpM.js";
110
- import "./agent-BsRYHa15.js";
108
+ import { n as handleGatewayRequest } from "./server-methods-Cb-Z7rAJ.js";
109
+ import "./push-apns-D5FHZT1S.js";
110
+ import "./agent-DkwJ_C7T.js";
111
111
  import "./agents.config-B7sNDvhz.js";
112
112
  import "./dm-policy-shared-CeFt0nch.js";
113
113
  import "./node-service-BH08wY5j.js";